Suche passendes Muster zum einlesen von Strings!!!
-
Guten Tag,
Ich bin grade dabei ein Programm zu schreiben(ANSI-C-Standard Konform), was Befehle aus einer Datei lädt und ausführt.
Ich kann die Datei öffnen und Zeilenweise auslesen. Jetzt ist es erforderlich eine Zeile in mehrere Strings zu Scannen(realisiert mit sscanf).
Mein Problem ist das Muster, da ich die passenden Wildcards nirgends finden kann.
Eine Zeile sieht z.B. so aus: "BEFEHL1(space)../irgendeine/pfad(space)BEFEHL2(space)BEFEHL3 " .
Nun muss ich ein passenden sscanf-Aufruf finden der dieses Beispiel in 4 Strings speichert.
Ich dachte mir das ich die Strings in etwa so einlesen muss:sscanf(string_file_line"%[^(space),%[^space],...]",string1,string2,...);
aber das klappt nicht.
Habt ihr lieben C-Programmierer einen passenden Aufruf von sscanf, der auf dieses Pattern passt?
Mir ist das direkt peinlich für so ein kleines Problem zu fragen. Komme aber einfach nicht weiter.
MfG Said
-
if( 4==sscanf(string_file_line,"%s%s%s%s",s1,s2,s3,s4) ) printf("%s%s%s%s",s1,s2,s3,s4);
falls deine Strings (z.B. Pfad) selbst keine Leerzeichen/Whitespaces enthalten.
-
Vielen dank für die schnelle Antwort!
Das Klappt bestens.
Ich habe zu kompliziert gedachtSchönen Tag noch!
MfG Said
-
Hallo, ich hab ne ähnlich schwierigkeit wie oben...
Ich lese ne txt.datei in einen buffer "rbuf" ein, deren in halt so aussieht:
1 111.22.333.44
2 222.333.44.55
3 333.44.555.66//zum ermitteln der Daten //=================================== short get_ident1 = 0; short get_ident2 = 0; short get_ident3 = 0; char getc_ident1[1] = {'0'}; char getc_ident2[1] = {'0'}; char getc_ident3[1] = {'0'}; char get_ip1[16] = ("0"); char get_ip2[16] = ("0"); char get_ip3[16] = ("0"); //Lese Daten ein sscanf(rbuf,"%s%s%s%s%s%s",&getc_ident1, &get_ip1, &getc_ident2, &get_ip2, &getc_ident3, &get_ip3); printf("\ndebug vor lesen rbuf: %s\n",rbuf); //===================================================== printf("\n===========debug getc_ident1: %s\n",getc_ident1); printf("\n===========debug get_ip1: %s\n",get_ip1); printf("\n===========debug get_ident1: %d\n",get_ident1); printf("\n===========debug getc_ident2: %s\n",getc_ident2); printf("\n===========debug get_ip2: %s\n",get_ip2); printf("\n===========debug get_ident2: %d\n",get_ident2); printf("\n===========debug getc_ident3: %s\n",getc_ident3); printf("\n===========debug get_ip3: %s\n",get_ip3); printf("\n===========debug get_ident3: %d\n",get_ident3); //=====================================================
Die ausgabe sieht dan so aus:
debug vor lesen rbuf: 1 111.22.333.44
2 222.333.44.55
3 333.44.555.66===========debug getc_ident1: 123
===========debug get_ip1:
===========debug get_ident1: 0
===========debug getc_ident2: 23
===========debug get_ip2: 222.333.44.55
===========debug get_ident2: 0
===========debug getc_ident3: 3
===========debug get_ip3: 333.44.555.66
===========debug get_ident3: 0
Die get_ident´s sollten nur ein Zahlzeichen enthalten...
_____________________________________________________________________________________wenn ich es ein klein wenig umstelle, das er nur einen zeichen einliest:
//Lese Daten ein sscanf(rbuf,"%c%s%c%s%c%s",&getc_ident1, &get_ip1, &getc_ident2, &get_ip2, &getc_ident3, &get_ip3); printf("\ndebug vor lesen rbuf: %s\n",rbuf); //===================================================== printf("\n===========debug getc_ident1: %s\n",getc_ident1); printf("\n===========debug get_ip1: %s\n",get_ip1); printf("\n===========debug get_ident1: %d\n",get_ident1); printf("\n===========debug getc_ident2: %s\n",getc_ident2); printf("\n===========debug get_ip2: %s\n",get_ip2); printf("\n===========debug get_ident2: %d\n",get_ident2); printf("\n===========debug getc_ident3: %s\n",getc_ident3); printf("\n===========debug get_ip3: %s\n",get_ip3); printf("\n===========debug get_ident3: %d\n",get_ident3); //=====================================================
dann gibt er das aus:
debug vor lesen rbuf: 1 111.22.333.44
2 222.333.44.55
3 333.44.555.66111.22.333.44ug getc_ident1: 1
===========debug get_ip1: 111.22.333.44
===========debug get_ident1: 0
111.22.333.44ug getc_ident2:
===========debug get_ip2: 2
===========debug get_ident2: 0
===========debug getc_ident3: 111.22.333.44
===========debug get_ip3: 222.333.44.55
===========debug get_ident3: 0
ka wie ichs dem beibirngen soll... :>
hat jemand ne idee?
-
hab die lösung
lag a der initialisierungshort get_ident1 = 0; short get_ident2 = 0; short get_ident3 = 0; char getc_ident1[2] = ("0"); char getc_ident2[2] = ("0"); char getc_ident3[2] = ("0"); char get_ip1[16] = ("0"); char get_ip2[16] = ("0"); char get_ip3[16] = ("0");
thx
h.a.n.l
have a nice life
-
nichtRegistriert schrieb:
hab die lösung
lag a der initialisierungNicht wirklich, nein.
Sicher dass du für "ident" nur ein Zeichen willst ? Das wären nur 10 maximale Zeilen.
Machs doch einfach so:short ident; char ip[16]; printf("\ndebug vor lesen rbuf: %s\n",rbuf); int posBuffer=0; int charsRead; while(sscanf(&rbuf[posBuffer], " %hd %s%n", &ident, ip, &charsRead) == 2) { posBuffer += charsRead; printf("\n===========debug ident: %hd", ident); printf("\n===========debug ip: %s", ip); //daten hier verarbeiten }
Ungetestet, sollte aber gehen.
EDIT:
Wutz schrieb:
Mag sein, dein Code ist aber nach wie vor Schrott.
Genauso wie dieser hier.
Ups, stimmt wohl. hab den Code überarbeitet.
-
nichtRegistriert schrieb:
have a nice life
Mag sein, dein Code ist aber nach wie vor Schrott.
-
DarkShadow44 schrieb:
while(sscanf(rbuf, "%dh %s ") == 2)
Ungetestet, sollte aber gehen.
Genauso wie dieser hier.
-
Wutz schrieb:
falls deine Strings (z.B. Pfad) selbst keine Leerzeichen/Whitespaces enthalten.
→ praxisfern
-
SaiD schrieb:
nope. hamwa nit. schreib nen kleinen parser, der die eingabe verarbeitet.
-
SaiD schrieb:
Habt ihr lieben C-Programmierer einen passenden Aufruf von sscanf, der auf dieses Pattern passt?
nope. hamwa nit. schreib nen kleinen parser, der die eingabe verarbeitet.