vscanf, vfscanf und vsscanf - Beispiele
-
HI, also ich hab die anderen schon hingekriegt nur noch das vsscanf kriege ich es nicht hin. Hier mal ein beispielprog, wo der fehler ist:
#include <stdio.h> #include <stdarg.h> char *mysscanf(char *string1,...) { va_list argzeiger; va_start(argzeiger, string1); vsscanf (string1,"%s",argzeiger); va_end(argzeiger); } int main(int argc, char *argv[],... ) { char str3[20]; //char str4[20]; printf("Geben Sie eine Zeichenkette:"); mysscanf(str3); //while(getchar()!='\n'); printf("vsscanf: %s\n",str3); return 0; }
Weisst einer wie ich das beheben kann? Ich hab schon viel versucht
vielen dank
-
Erstmal benötigst du beim main keine Ellipse (",..."). Und dann mußt du deiner Funktion mindestens zwei Parameter übergeben, damit sie richtig arbeitet (vsscanf liest den ersten Parameter (in deinem Beispiel string1=str3) und schreibt die gefundenen Werte in die va_list (argzeiger - weist bei dir auf Müll-Daten).
Außerdem - wenn dein Formatstring fest vorgegeben ist, weißt du auch, wieviele und welche Parameter du benötigst, dann sind die v*scanf Funktionen überflüssig
-
Die Ellipse war ein zurückgebliebener Test
Leider weisst es immer noch auf Müll-Daten
Hier der bearbeitende Code:#include <stdio.h> #include <stdarg.h> char *mysscanf(char *string1,char *string2,...) { va_list argzeiger; va_start(argzeiger, string2); vsscanf (string2,"%s",argzeiger); va_end(argzeiger); } int main(int argc, char *argv[] ) { char str3[20]; char str4[20]; printf("Geben Sie eine Zeichenkette ein:"); mysscanf(str4, str3); //while(getchar()!='\n'); printf("vsscanf: %s\n",str3); return 0; }
-
myscanf() war in der oberen Version schon richtig - in der jetzigen Version hast du das dazu passende main().
(va_start() beginnt mit dem ersten namenlosen Parameter der Funktion - wenn du nur für die benannten Parameter Werte übergibst, kann das nichts werden)
-
kannst du bitte mir zeigen wie es richtig isr?
ich kriegs net hin
-
Muß man hier alles selber machen
Du hast doch beide Teile schon geschrieben und ich hatte dir gesagt, was zusammen gehört:
char *mysscanf(char *string1,...) { va_list argzeiger; va_start(argzeiger, string1); vsscanf (string1,"%s",argzeiger); va_end(argzeiger); } //btw, wieso ist die eigentlich als "char*" deklariert, wenn sie nichts zurückgeben will? int main(int argc, char *argv[] ) { char str3[20]; char str4[20]; printf("Geben Sie eine Zeichenkette ein:"); mysscanf(str4, str3); //while(getchar()!='\n'); printf("vsscanf: %s\n",str3); return 0; } //wenn du die Kommandozeilen-Parameter nicht brauchst, reicht hier auch "int main()"
PS: vsscanf dient nicht zum Eingeben von Tastatur, sondern zum parsen von vorhandenen Strings.
-
ich habs nicht so gepeillt
und ich glaube ich hab das nicht so richtig verstanden *vollverwirrt*:vsscanf dient nicht zum Eingeben von Tastatur, sondern zum parsen von vorhandenen Strings.
Edit:
Und da fehlt was:
char str4[20] = "Hallo";
-
maximo schrieb:
ich habs nicht so gepeillt
und ich glaube ich hab das nicht so richtig verstanden *vollverwirrt*:vsscanf dient nicht zum Eingeben von Tastatur, sondern zum parsen von vorhandenen Strings.
Lies dir mal die Manuals zu den scanf-Funktionen durch - die Kürzel am Anfang des Namens erklären die jeweilige Funktion: scanf() liest von Tastatur, fscanf() aus einem File, sscanf() aus einem übergebenen String (genauer char*), v... ist die jeweils zugehörige va_list-Version.
(Oder im Klartext - der Hinweis "Geben Sie eine Zeichenkette ein:", den dein Programm liefert, ist etwas irreführend ;))
-
danke für die erklärung, ich dachte es mir schon so
(Oder im Klartext - der Hinweis "Geben Sie eine Zeichenkette ein:", den dein Programm liefert, ist etwas irreführend ;))
Auf jeden fall. Dieses v hat mich bisschen in die irre geführt
-
Die scanf-Funktionen sind Teufelszeugs und sollten nie
verwendet werden. Das Zeugs ist einfach viel zu unsicher und
gerade bei der Verwendung von Dateien als Eingabe sogar
fahrlässig.
-
Hast du eine bessere Methode, unter ANSI C Daten einzulesen? Dann immer her damit
-
die gibt es auch z.b. vscanf
-
maximo, und warum soll die sicherer sein?
-
maximo schrieb:
die gibt es auch z.b. vscanf
Tolle Idee - weil die scanf Familie zu unsicher ist, nehmen wir halt vscanf
-
sorry, ich les nur vom buch ab
vscanf ist von C99 und dachte es ist sicherer?
-
halbwissen ist gefaehrlich.
glaube umsomehr.
-
CStoll schrieb:
Hast du eine bessere Methode, unter ANSI C Daten einzulesen? Dann immer her damit
Ja, z. B. strtok.
Buffer aufmachen, file einlesen udn mit strtok die einzelnen
tokens auslesen. Ist viel schneller und tausendmal zuverlässiger.
-
maximo schrieb:
sorry, ich les nur vom buch ab
vscanf ist von C99 und dachte es ist sicherer?Also hier ein aus dem Kopf geschriebens Beispiel:
/* Datei öffnen */
FILE *p_file = fopen ("C:\\Datei", "rb");
if (p_file == NULL)
{
return FALSE;
}// Dateigröße bestimmen.
struct _stat state;
_fstat (fileno(p_file), state);
size_t len = state.st_size;// Speicher entsprechender Größe allokieren
char *p_buffer = malloc (len+1);
if (p_buffer == NULL)
{
fclose (p_file);
return -1;
}// Datei lesen
if (fread (p_buffer, 1, len, p_file)
{
fclose (p_file);
free (p_file);
return -2;
}fclose (p_file);
char *p = p_buffer;
// Zum Beispiel csv parsen
while ((p = strtok (p, ",\n")) != NULL)
{
/* Hier jetzt den gelesenen Wert verarbeiten.
in p steht genau der Wertz der durch z. B.
, oder \n getrennt wurde.
*/
}
free (p_buffer);
}
-
Sicher könnte diese Variante sicherer sein, aber ob sie wirklich einfacher anzuwenden ist als die scanf-Funktionen wage ich zu bezweifeln:
- _fstate() ist afaik keine Standard-Funktion
- Einlesen von Tastatur wirst du damit auch nicht hinbekommen (oder schaffst du es, alle vom User kommenden Eingaben bei Programmbeginn zu bekommen?)
- korrekt parsen mußt du deine Daten an dieser Stelle auch noch
PS: und "free(p_file);" ist nonsens