2009-08-09 7 views

Antwort

1

Scanf analysiert eine Zeichenfolge, die Sie in gelesen (oder erstellt) (das war mein böser Zwilling this- mich nicht zu vergessen, referiert zu werden), und fgets liest eine Zeile aus einer geöffneten FILE *. Oder meinst du fscanf?

+1

können Sie von der Standardeingabe (Konsole) mit fgets lesen. –

20

Es gibt mehrere Unterschiede. Zwei entscheidende sind:

  • fgets() aus jeder offenen Datei lesen können, aber scanf() liest nur die Standardeingabe.
  • fgets() liest 'eine Zeile Text' aus einer Datei; scanf() kann dafür verwendet werden, aber auch Konvertierungen von String in eingebaute numerische Typen werden behandelt.

Viele Menschen werden fgets() verwenden, um eine Zeile von Daten zu lesen und dann sscanf() es sezieren zu verwenden.

4
int scanf(const char * restrict format, ...); 

scanf (3) sucht nach bestimmten Muster durch das Argument Format definiert auf der gegebenen Eingabe bekannt als stdin, wo das Muster von Ihnen festgelegt wird. Die angegebene Eingabe für scanf (3) kann je nach Variante (scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf) eine Zeichenfolge oder eine Datei sein.

char *fgets(char * restrict str, int size, FILE * restrict stream); 

fgets (3) liest nur eine Linie aus der Eingabedatei Strom und der Bytes als null Abschluß Zeichenfolge an den Puffer str und begrenzen die Ausgabe an die Puffer zu gegebener Byte kopieren in Größe.

0

Der Hauptunterschied liegt in der Tatsache, dass scanf keine Grenzen für die Anzahl von Zeichen haben, die (in dem Standardgebrauch) gelesen werden kann, während fgets eine maximale Anzahl von Zeichen hat, die gelesen werden kann.

Siehe den Prototyp der beiden Funktionen:

char * fgets (char * dest, int size, FILE * stream);

int scanf (const char * -Format, ...);

Sie können sehen, dass der zweite Parameter von fgets auferlegt, um maximal char zu lesen.

Ein weiterer deutlicher Unterschied ist der Rückgabewert: fgets Rückkehr ein Zeiger auf dest auf Erfolg; scanf geben Sie die Anzahl der übereinstimmend zugewiesenen und zugewiesenen Eingabeelemente zurück. Dann wird die Scanf Funktion tastet Eingang nach Format und liest eine Eingabe von dem Standard-Eingabestrom stdin, während einer Eingabe von fgetsFILE * stream als Default ausliest.

Zusammenfassend können Sie scanf verwenden, um Daten aus einer Datei zu lesen und sie in ein Array fester Größe (zum Beispiel) einfügen, hat nicht viel Sinn. Ein Vorteil von scanf ist die Formatierung der Ausgabedaten: Wenn die Funktion 12345\n liest, ist die Ausgabe 12345, während das fgets liest und zurückgibt, bis \n (enthalten), ein \0 am Ende als Zeichenfolge Terminator hinzufügen.

0

Es sollte beachtet werden, dass scanf Muster Spezifikationen Feldbreite Grenzen erlauben:

scanf(" %80s", mybuffer); 

Aber wo printf() die Breite als Variable übergeben werden können (mit '*'):

printf("My name is %*s.\n", 20, name); 

scanf() nicht. (Er interpretiert die ‚*‘ als Flag zu unterdrücken/ignorieren das Feld ganz.) Das bedeutet, Sie Dinge wie diese am Ende tun:

#define NAMEWIDTH 40 
char buffer[ NAMEWIDTH + 4 ]; 
... 
scanf(" %40x", buffer); 

und keine Möglichkeit, das Feld 40 zu verbinden Breite im scanf() mit der Pufferbreite 40 in der Pufferdeklaration.