Ich möchte wissen, was der Unterschied zwischen ist fgets()
und scanf()
. Ich benutze C als meine Plattform.
Unterschied zwischen scanf() und fgets()
Biswajyoti Das
Es gibt mehrere Unterschiede. Zwei entscheidende sind:
fgets()
kann aus jeder geöffneten Datei lesen, aberscanf()
liest nur die Standardeingabe.fgets()
liest ‘eine Textzeile’ aus einer Datei;scanf()
kann dafür verwendet werden, handhabt aber auch Konvertierungen von Zeichenfolgen in eingebaute numerische Typen.
Viele Leute werden verwenden fgets()
um eine Datenzeile zu lesen und dann zu verwenden sscanf()
es zu sezieren.
Daniel
int scanf(const char * restrict format, ...);
scanf(3) sucht nach bestimmten Muster definiert durch die Formatargument auf der gegebenen Eingabe bekannt als stdin, wobei das Muster von Ihnen definiert wird. Die gegebene Eingabe zu scanf(3)je nach Variante (scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf), kann ein String oder eine Datei sein.
char *fgets(char * restrict str, int size, FILE * restrict stream);
fgets(3) liest nur a Linie aus der Eingabedatei Strom und kopiere die Bytes als Null-terminierenden String in den Puffer Str und begrenzen Sie die Ausgabe an den Puffer auf die angegebenen Bytes in Größe.
Kelly Robins
Scanf führt keine Begrenzungsprüfung durch. fgets wird wahrscheinlich die bessere Wahl sein. Sie können es dann mit sscanf() auswerten.
Gute Diskussion zum Thema hier-
http://cboard.cprogramming.com/c-programming/109243-scanf-vs-fgets.html
Wie erlauben Sie die Eingabe von Leerzeichen mit scanf? (Das war mein böser Zwilling, der belehrt wurde, weil er das vergessen hatte – nicht ich)
-
Bei numerischen Typen muss scanf() keine Begrenzungsprüfung durchführen. Für String-Typen können Sie scanf() anweisen, eine Begrenzungsprüfung durchzuführen.
– Jonathan Leffler
9. August 2009 um 21:45 Uhr
Joel Rees
Es sollte erwähnt werden, dass scanf
Musterspezifikationen erlauben Feldbreitenbeschränkungen:
scanf( " %80s", mybuffer );
Aber wo printf()
ermöglicht die Übergabe der Breite als Variable (mit ‘*’):
printf( "My name is %*s.\n", 20, name );
scanf()
nicht. (Es interpretiert das ‘*’ als Flag, um das Feld vollständig zu unterdrücken/ignorieren.) Was bedeutet, dass Sie am Ende Dinge wie die folgenden tun:
#define NAMEWIDTH 40
char buffer[ NAMEWIDTH + 4 ];
...
scanf( " %40x", buffer );
und keine Möglichkeit, die Feldbreite 40 in der zu verbinden scanf()
mit der Pufferbreite 40 in der Pufferdeklaration.
scanf analysiert einen String, den Sie eingelesen (oder erstellt) haben, und fgets liest eine Zeile aus einer geöffneten Datei*. Oder meinst du fscanf?
Der Hauptunterschied liegt darin, dass scanf
hat keine Begrenzung für die Anzahl der Zeichen, die gelesen werden können (in der Standardverwendung), während fgets
hat eine maximale Anzahl von Zeichen, die gelesen werden können.
Sehen Sie sich den Prototyp der beiden Funktionen an:
char * fgets (char * dest, int size, FILE * stream);
int scanf (const char * format, …);
Sie können sehen, dass der zweite Parameter von fgets
zwingt höchstens zu lesen größe char.
Ein weiterer deutlicher Unterschied ist der Rückgabewert: fgets
gibt einen Zeiger auf zurück dest
auf Erfolg; scanf
gibt die Anzahl der Eingabeelemente zurück, die erfolgreich abgeglichen und zugewiesen wurden. Dann ist die Scanf Funktion scannt Eingaben nach Formatund liest Eingaben aus dem Standardeingabestream stdinwährend fgets
liest Eingaben aus Datenfluss als Standard.
Abschließend könnten Sie verwenden scanf
Daten aus einer DATEI zu lesen und sie (zum Beispiel) in ein Array fester Größe einzufügen, hat nicht viel Sinn. Ein Vorteil von scanf
ist die Formatierung der Ausgabedaten: wenn die Funktion liest 12345\n
die Ausgabe ist 12345
während fgets liest und bis zurückgibt \n
(enthalten), Hinzufügen von a \0
am Ende als String-Terminator.