Unterschied zwischen scanf() und fgets()

Lesezeit: 3 Minuten

Benutzeravatar von Biswajyoti Das
Biswajyoti Das

Ich möchte wissen, was der Unterschied zwischen ist fgets() und scanf(). Ich benutze C als meine Plattform.

Es gibt mehrere Unterschiede. Zwei entscheidende sind:

  • fgets() kann aus jeder geöffneten Datei lesen, aber scanf() 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.

Daniels Benutzeravatar
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.

Benutzeravatar von Kelly Robins
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

Benutzeravatar von Joel Rees
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\ndie Ausgabe ist 12345während fgets liest und bis zurückgibt \n (enthalten), Hinzufügen von a \0 am Ende als String-Terminator.

1394870cookie-checkUnterschied zwischen scanf() und fgets()

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy