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
Arnaud schrieb:> Lässt sich das mit scanf lösen?
Ja.
Arnaud schrieb:> Wer kann mir das bei scanf %[^:]:%d erklären> was passier beim zweiten : genau?
Es wird überlesen.
%[^:] liest alle Zeichen bis auf den :
Der steht also noch drin.
Mit dem folgenden : wird der dann auch überlesen.
Mit dem folgenden %d wird eine Dezimalganzzahl eingelesen.
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.
Arnaud schrieb:
[ strtok() ]
> Vielen Dank, da war ich leider schon.> Zu kompliziert für mich
Das ist schade. Für dich. Such dir ein einfacheres Hobby.
Vielleicht was mit Bienen? Und Blümchen?
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.
Arnaud schrieb:> 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?
Das hängt nicht davon ab, wie lang der String ist, sondern ob die Anzahl
der Felder immer gleich ist oder variieren kann.
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
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.
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.
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.