zwei strings aus einer zeile mit fscanf einlesen
-
Der erste String liest bis zum . '[^]' liest alles und stellt beim Dollarzeichen seine Arbeit ein. Das Ergebnis landet in teil1. Das nächste zu lesende Zeichen ist also ein , das wir einfach weglesen. Dann kommt '%*[^]' macht prinzipell das gleiche wie oben erkläret, schmeißt das Ergebnis aber weg (das sagt der *). Dann ist mir nichts mehr eingefallen, also hab' ich alles bis zum '\n' nach teil2 lesen lassen und dann das folgende '\n' aufgefressen. Eigentlich keine so faszinierende Idee ...
Ich würde so etwas übrigens nicht mit fscanf direkt machen, sondern höchstens mit sscanf (der IMHO einzig brauchbare Teil der *scanf-Familie).
-
Hallo,
was macht das fuer einen Unterschied, ob mit fscanf oder mit sscanf? Fuer sscanf muss ich die Zeile ja dann erst in eine Variable einlesen!
Und gibt es eine Moeglichkeit, die strings mit 0en zu fuellen bevor man sie benutzt? Wenn jetzt eine Zeile drin ist, in der kein $ vorkommt, dann hab ich noch das Zeug aus dem letzten Durchgang mit drin.
Ueberlebenskuenstler
-
Original erstellt von Ueberlebenskuenstler:
Und gibt es eine Moeglichkeit, die strings mit 0en zu fuellen bevor man sie benutzt? Wenn jetzt eine Zeile drin ist, in der kein $ vorkommt, dann hab ich noch das Zeug aus dem letzten Durchgang mit drin.Eben darum liest man mit fgets ein, macht eine simple Routineprüfung und übergibt dann bei Bedarf die Kontrolle an sscanf.
Mit Nullen befüllen geht mittels Initialisierung (»char a[199] = { 0 };«), mit memset oder mit einer Schleife. Es sollte aber sogar reichen, einfach die strings am 'Anfang zu terminieren' (»*a = *b = *c = '\0';«).
-
So, jetzt hab ich nur noch ein kleines Problem:
soll jetzt in einer dritten Variable gespeichert werdern. Nur ZEIT alleine ist eigentlich kein Problem, aber ich hab jetzt leider keine Ahnung, wie ich die Dollarzeichen miteinlesen kann! Es steht ja nicht fest, was das naechste Zeichen nach dem $ ist! Weisst du, wie man das machen kann?Ueberlebenskuenstler
-
Einfach nicht miteinlesen und dann dranhängen?
*scanf ("%[^]%[^]%[^\\n]\\n", test1, bla, test2); strcpy (bla + strlen (bla), "");
Bei 3 Variablen wird es aber schon recht kompliziert, besonders wenn man keinen Buffer-Overflow riskieren will ...
[ Dieser Beitrag wurde am 09.03.2003 um 21:07 Uhr von Daniel E. editiert. ]
-
Wo ist da die Gefahr fuer einen Buffer-Overflow?
Ueberlebenskuenstler
-
Original erstellt von Ueberlebenskuenstler:
Wo ist da die Gefahr fuer einen Buffer-Overflow?de@murphy:~/tmp$ cat > t.c #include <stdio.h> int main (void) { char buf[10]; if (scanf ("%[^\n]", buf) == 1) { puts (buf); return 0; } return 1; } de@murphy:~/tmp$ cc t.c -o t de@murphy:~/tmp$ tr -d ' ' < t.c | ./t #include <stdio.h>int main (void){ char buf[10]; if (scanf ("%[^\n]", buf) == 1) { puts (buf); return 0; } return 1;} Segmentation fault (core dumped)
-
Ja, wenn man es so macht, dann schon, aber bei mir im eigentlichen Programm werden nur maximal 255 Zeichen eingelesen und jede der 3 Variablen hat die Laenge 255!
Aber danke fuer den Hinweiss! Gibt es eine Moeglichkeit, fuer jede einzelne Variable die maximale Laenge zu bestimmen?
Ueberlebenskuenstler
-
Original erstellt von Ueberlebenskuenstler:
**bei mir im eigentlichen Programm werden nur maximal 255 Zeichen eingelesen
**Wie kontrollierst Du das per fscanf?
Gibt es eine Moeglichkeit, fuer jede einzelne Variable die maximale Laenge zu bestimmen?
Gibt es. Das ist allerdings mindestens ekelig:
char buf[100]; scanf ("%99s", buf);
Langsam müssten wir dann auch mit der scanf-Manpage fertig sein ... :->
-
Hallo,
also ich nehme an, dass es in meinem fall dann mit
scanf("%255[^$]",teil1);
geht.
Vielen Dank fuer deine Hilfe!
Ueberlebenskuenstler