0 Daumen
602 Aufrufe

Frage:

Hallo, ich möchte gerne einen sehr langen String parsen. Dafür kann ich den delimiter semikolon ; verwenden. So weit so gut. Nur mein Problem ist dass in dem langen String oftmals ein doppelter semikolon vorkommt, z.b ;;. Aufgrund dessen kommt es bei dem parsen zum Fehler. Kann ich da etwas machen? Bzw. wie kann ich den String eindeutig parsen auch wenn an unterschiedlichen stellen manchmal ;; vorkommt? Zur Info: Ein doppelter ;; bedeutet dass da Daten fehlen.

Bei dem array r[BUF] kommt ein ;; vor.Unbenannt.png
Code:


#include <stdio.h>
#include <string.h>
#define BUF 100


int main()
{
 

      char array[] ="10000;07/01/1986;68391610;68391610;OPTIMUM MANUFACTURING INC;OMFGA; 7952;10;A;  10396; 3;3;3990;3990;39;399;03/12/1986;OMFGA;;Q;A;R;    -2.56250;      1000;      .;    2.75000;    2.37500;    .;    .;    .;  C;  C;  3680;2;30/01/1986;  .;    .;        .;    .;    .;        .;  .; .;  .;    .;  .;  .; 1.00000;  1.00;          .;          .;          .;      .; .     1;      1;      9;      2;      0.013809;  0.013800; 0.011061; 0.011046; 0.014954\n";
      char a[BUF],b[BUF],c[BUF],d[BUF],e[BUF],f[BUF],g[BUF],h[BUF],i[BUF],j[BUF],k[BUF],l[BUF],m[BUF],n[BUF],o[BUF],p[BUF],q[BUF],r[BUF],s[BUF],tt[BUF],u[BUF],v[BUF]; // a->PERMNO; b->date; c->CUSIP; d->NCUSIP; e->COMNAM; f->DIVAMT; g->CFACPR
      char w[BUF],x[BUF],y[BUF],z[BUF],aa[BUF],ab[BUF],ac[BUF],ad[BUF],ae[BUF],af[BUF],ag[BUF],ah[BUF],ai[BUF],aj[BUF],ak[BUF],al[BUF],am[BUF],an[BUF],ao[BUF],ap[BUF];
      char aq[BUF],ar[BUF],as[BUF],at[BUF],au[BUF],av[BUF],aw[BUF],ax[BUF],ay[BUF],az[BUF],ba[BUF],bb[BUF],bc[BUF],bd[BUF],be[BUF],bf[BUF],bg[BUF],bh[BUF],bi[BUF],bj[BUF],bk[BUF];



  sscanf(array, "%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];%[^;];",a,b,c,d,e,f, g, h, i, j, k, l, m ,n, o,p,q,r,s,tt,u,v,w,x,y,z,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an,ao,ap,aq,ar,as,at,au,av,aw,ax,ay,az,ba,bb,bc,bd,be,bf,bg,bh,bi,bj);
  printf("%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s\n",a,b,c,d,e,f, g, h, i, j, k, l, m ,n, o,p,q,r,s,tt,u,v,w,x,y,z,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an,ao,ap,aq,ar,as,at,au,av,aw,ax,ay,az,ba,bb,bc,bd,be,bf,bg,bh,bi,bj);




  return 0;
}

Avatar von
Problem ist dass in dem langen String oftmals ein doppelter semikolon vorkommt

Das ist kein Problem. Das ist eine Tatsache.

Ein Problem ist, dass dein Programm nicht das macht, was du willst was es macht. Deshalb die Fragen

  1. Was macht dein Programm, wenn ein doppeltes Semikolon vorkommt?
  2. Was willst du dass dein Programm macht, wenn ein doppeltes Semikolon vorkommt?

1. So weit ich es sehe erwartet das Program dass ziwschen ;; ein Wert vorkommt. Wenn sich da gar kein Wert befindet wird, wird einfach irgrendwas ins Array reingeschrieben. (vermutlich als wenn man eine Variable nicht initialisiert)

2. Ich möchte dass es erkennt dass kein Wert vorhanden ist und einen Wert reinschreibt z.b x. Oder einfach annimt dass etwas drin steht damit er den nächsten Wert parsen kann.

1 Antwort

0 Daumen
 
Beste Antwort
#include <stdio.h>
#include <string.h>

#define BUF 100
#define CELLS 59

void parse(char string[], char buffers[][BUF]);

int main()
{
  char array[] ="10000;07/01/1986;68391610;68391610;OPTIMUM MANUFACTURING INC;OMFGA; 7952;10;A;  10396; 3;3;3990;3990;39;399;03/12/1986;OMFGA;;Q;A;R;    -2.56250;      1000;      .;    2.75000;    2.37500;    .;    .;    .;  C;  C;  3680;2;30/01/1986;  .;    .;        .;    .;    .;        .;  .; .;  .;    .;  .;  .; 1.00000;  1.00;          .;          .;          .;      .; .     1;      1;      9;      2;      0.013809;  0.013800; 0.011061; 0.011046; 0.014954\n";

  char buffers[CELLS][BUF];
  parse(array, buffers);
  for (int i = 0; i < CELLS; ++i) {
      printf("%s\n", buffers[i]);
  }

  return 0;
}

void parse(char string[], char buffers[][BUF]) {
  int len = strlen(string);
  for (int pstring = 0, pbuf=0, pcell=0; pstring < len; ++pstring) {
      if (string[pstring] == ';') {
          buffers[pbuf][pcell] = '\0';
          ++pbuf;
          pcell = 0;
      } else {
          buffers[pbuf][pcell] = string[pstring];
          buffers[pbuf][pcell+1] = '\0';
          ++pcell;
      }
  }
}
Avatar von 5,7 k

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community