C: string auswerten

Gast #7134110
Lesenswert?

Guten Morgen in meiner C Anwendung kann ich eine Textdatei einlesen und 
auch zeilenweise ausgeben. Nun habe ich ein Problem wie ich zum Beispiel 
eine in einer Zeile zu einer bestimmten Stelle springen kann um dann die 
Werte in einen Puffer zu speichern.

Zeile:
1
1:23.10.2021:08:16:09;A;B;12 23 34 45 55 66 77;0.0 %

Was ich brauche ist der Dateninhalt
1
12 23 34 45 55 66 77
Gast #7134122
Lesenswert?

Hmmm, ganz einfach:
1
#include <stdio.h>
2

3
char *strbuf = "1:23.10.2021:08:16:09;A;B;12 23 34 45 55 66 77;0.0 %";
4

5
int main()
6
{
7
    char buf[100];
8

9
    memset(buf, 0, sizeof(buf));
10
    memcpy(buf, strbuf + 26, 20);
11
    printf("[%s]\n", buf);
12

13
    return 0;
14
}
Gast #7134127
Lesenswert?

Der Ansatz von Teoderix funktioniert nur, wenn die Elemente, die vor dem 
gesuchten Text stehen, immer exakt die gleiche Länge haben. Bei der 
Uhrzeit kann man davon ausgehen, beim Datum ist hingegen schon unsicher, 
ob führende Nullen verwendet werden. Steht da "01.05.2023" oder 
"1.5.2023"?

Abhilfe: Untersuche die Struktur der Zeile.

Es sieht so aus, als ob der gewünschte Text zwischen dem dritten und 
vierten Semikolon zu finden ist.

strchr durchsucht einen String nach dem Vorkommen eines Zeichens und 
gibt einen Pointer darauf (oder NULL) zurück.

Also musst Du das dritte und vierte Semikolon suchen und den Text 
dazwischen bestimmen.
#7134215
Lesenswert?

Du kannst auch strtok_r() benutzen, das verändert aber deinen 
Ausgangsstring.

sscanf mit "%[^;]" geht auch
1
char *text ="1;23.10.2021;08:16:09;A;B;12 23 34 45 55 66 77;0.0 %"
2
char gesuchterText[100];
3

4
sscanf(text,"%*[^;];%*[^;];%*[^;];%*[^;];%*[^;];%[^;];%*[^;]", gesuchterText);
Gast #7134217
Lesenswert?

Mo schrieb:
> WIe kann ich dann an einer bestimmten Stelle springen um dann die Daten
> zu entnehmen?

Indem Du nach der Stelle suchst. Die Anzahl der Semikola vor dem 
gewünschten Text ändert sich ja wohl nicht, oder?

Also musst Du dreimal nacheinander ein Semikolon suchen.
Gast #7134234
Lesenswert?

Dirk B. schrieb:
> Das Format hat sich zwischendurch geändert.

Praktisch.

Wie auch immer, der interessante Text steht also zwischen dem fünften 
und sechsten Semikolon.

Jetzt kann man entweder nach dem fünften Semikolon suchen und alle 
Zeichen bis zum sechsten Semikolon extrahieren, oder aber man schreibt 
den Kram etwas generischer und zerlegt den String in alle durch Semikola 
getrennte Bestandteile, die man sich irgendwo aufhebt und dann nach Lust 
und Laune auswerten kann.

Iterieren mit strtok wäre auch noch eine Möglichkeit, wenn es OK ist, 
daß der Quellstring zerstört wird.
#7134250
Lesenswert?

Dirk B. schrieb:
> Du kannst auch strtok_r() benutzen, das verändert aber deinen
> Ausgangsstring.

viel zu modern :)
die Fehlersuche macht mit dem originalen strtok viel mehr Spaß
1
#include <stdio.h>
2
#include <string.h>
3

4
int main() {
5
  char input[] ="1;23.10.2021;08:16:09;A;B;12 23 34 45 55 66 77;0.0 %";
6
  strtok(input,";");
7
  strtok(0,";");
8
  strtok(0,";");
9
  strtok(0,";");
10
  strtok(0,";");
11
  printf("Data=[%s]\n", strtok(0,";"));
12
  return 0;
13
}

Ansonsten halt selber die ';' zählen:
1
  const char *input ="1;23.10.2021;08:16:09;A;B;12 23 34 45 55 66 77;0.0 %";
2
  for (int i=0; *input && i<6; ++input)
3
    if (*input==';') i++;
4
    else if (i==5) putchar(*input);
(Firma: Privat) #7134577
Lesenswert?

Ich würde das einfach mit regulären Ausdrücken suchen.

";[0-9]{1,2} " + 1 -> findet Position des ersten Wertes
" [0-9]{1,2};"     -> findet Position des letzten Wertes

Je nachdem, wie lang (2 oder 3 Zeichen) die zweite Position
ist, kann man den String exakt ausschneiden, egal, ob es nun
1 - oder 2stellige Zahlen sind und auch egal wieviele.

Geht dann einfach mit etwas rechnen.
Bitte das Blank in den Suchausdrücken beachten.
Gast #7135050
Lesenswert?

Mo schrieb:
> Der string ändert sich ja von der ANzahl der Zeichen wenn die Nummer >1
> wird.
> WIe kann ich dann an einer bestimmten Stelle springen um dann die Daten
> zu entnehmen?

Was ist für dich eine bestimmte Stelle? Durch welche Zeichen oder 
Zeichenfolgen zeichnet sie sich aus?

Dein Problem scheint zu sein, daß du einen Input (von wo auch immer) 
zeilenweise parsen mußt, um an das zu kommen, was du lesen willst. Kläre 
erstmal das erwartete Format der Zeilen und dann sehen wir weiter.

W.S.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren