C String nach Zeichen zerlegen

Gast #6057739
Hallo,

biete um Hilfe.
Habe einen String

unit8 String[100] = "Kessel1:2:1:50:128:2:8000" (ist nicht alles, geht 
so weiter)

Ich möchte die Zahlen aus diesem String auslesen.
Programmiere in C
Kessel1 ist der Indikator, von wo das kommt, der ist auch wichtig.
ich benötige die Zahlen 2,1,50,128,2,8000.
Und diese sollen in die Int Variablen geschrieben werden.

Mir ist bekannt, dass dieses Thema schon millionenfach diskutiert wurde, 
ich verstehe das leider beim besten Willen nicht.

Der String ist relativ lang.
Lässt sich das mit scanf lösen?
Oder muss man dafür eine Schleife schreiben, die alle : prüft?

Vielen Dank
Arnaud
#6057802
strtok ist nicht nötig. das ist auch etwas doof, da der Originalstring 
zerstört wird.

Bei der Standardfunktion strtol kann man den Parameter **endptr auf den 
: auswerten bzw. für das folgende strtol verwenden.

strtol wird ja sowieso für die Umwandlung der Zahlen gebraucht.
Gast #6057882
1
    char str[100] = "sensor1:100:200:300:400";                                                                                          
2
                                                                                                                                        
3
    char sensor_name[15];                                                                                                               
4
    int data[4];                                                                                                                        
5
                                                                                                                                        
6
    sscanf(str, "%[^:]%*c%d%*c%d%*c%d%*c%d", sensor_name, &data[0],                                                                     
7
            &data[1], &data[2], &data[3]);                                                                                              
8
                                                                                                                                        
9
    printf("sensor: %s\ndata: %d, %d, %d, %d\n", sensor_name,                                                                           
10
            data[0], data[1], data[2], data[3]);

Mit %*c wird das Trennzeichen ":" übersprungen.

stackoverlow sei dank:
https://stackoverflow.com/questions/13757430/sscanf-delimiters-for-parsing/13757540


Ich würde lieber strtok(...) nehmen.
Gast #6057892
Dirk B. schrieb:
> strtok ist nicht nötig. das ist auch etwas doof, da der Originalstring
> zerstört wird.

Nö strok ist schon in Ordnung. Falls man den String wirklich noch mal 
brauchen sollte, kann man sich ja eine Kopie anfertigen und diese 
zerlegen.

Mit strok kann man flexibler auf unterschiedlich lange Strings 
reagieren.
#6057959
Rolf M. schrieb:
> Das hängt nicht davon ab, wie lang der String ist, sondern ob die Anzahl
> der Felder immer gleich ist oder variieren kann.

Wenn die Reihenfolge bleibt, kann man den Rückgabewert von scanf 
auswerten und entsprechend reagieren.

Wenn man statt %*c den : in den Formatstring schreibt, braucht man den 
auch gar nicht mehr überprüfen.

Ohne scanf und strtok
1
char *endptr;
2
int data[ANZSENSOREN];
3
int i=0;
4

5
endptr = strchr(str,':');
6
while (endptr && (*endptr == ':')
7
{ data[i++] = strtol(endptr+1,&endptr);
8
  if (i >= ANZSENSOREN) break;
9
}
#6057964
Zeno schrieb:
> Nö strok ist schon in Ordnung. Falls man den String wirklich noch mal
> brauchen sollte, kann man sich ja eine Kopie anfertigen und diese
> zerlegen.
>
> Mit strok kann man flexibler auf unterschiedlich lange Strings
> reagieren.

Kopien von Strings, deren Länge vorher unbekannt ist, ist in C eine 
beliebte Fehlerquelle.

Zudem kann man strtok nicht gleichzeitig auf verschiedene Strings laufen 
lassen.
#6058003
Arnaud schrieb:
> Habe einen String
>
> unit8 String[100] = "Kessel1:2:1:50:128:2:8000" (ist nicht alles, geht
> so weiter)

Vielleicht ist dein Problem ja einfach eine Ebene weiter oben?

Entweder Du liest den String von irgendwoher ein (dann könntest Du ihn 
gleich beim Einlesen an Ort und Stelle in die für dich relevanten 
Einzelteile zerlegen) oder Du hast ihn wie geschrieben "am Stück" als 
Konstante im Programm: dann solltest Du dir überlegen, ob das so 
geschickt  und nicht vielleicht besser in mehreren Variablen (oder 
struct-Membern) unterzubringen ist.
Beitrag #6058007 wurde von einem Moderator gelöscht.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.