2016-06-01 34 views
0

Bin mir bewusst, dass der Unterschied zwischen scanf() und gets() Funktion ist, dass scanf() den Eingabe-String weiter liest, bis es auf ein Leerzeichen trifft, während gets() weiter liest Eingabezeichenfolge, bis ein \ n oder EOF (Ende der Datei) gefunden wird.c Programmierung: (scanf und gets)

Um diesen Unterschied in Aktion zu sehen, habe ich versucht, ein Beispiel auf meinem eigenen Schreiben, das wie folgt lautet:

    #include <stdio.h> 
        int main() 
       {  
        char a[20]; 
        printf("enter the string\n"); 
        scanf("%s",&a); 
        printf("the string is %s\n",a); 
        char b[20]; 
        printf("enter the string\n"); 
        gets(b); 
        printf("the string is %s\n",b); 
        return 0; 
       } 

Wenn die Variable a die Zeichenfolge „Manchester United“ als Eingabe gegeben wurde, wurde die Ausgabe:

    enter the string 
        manchester united 
        the string is manchester 
        enter the string 
        warning: this program uses gets(), which is unsafe. 
        the string is united 

Was ich erwartet hatte als Ausgabe nur der erste Teil der die manchester und dann ist eine auf die Variable angegebene Zeichenfolge war, mich das Programm auffordert, die neue Eingabezeichenfolge für die Variable b einzugeben. Stattdessen endete ich mit der oben angegebenen Ausgabe.

basierend auf der Ausgabe, was ich verstehe ist:

Es kann, dass so bald sehen, wie scanf(), um die Leerzeichen trifft, stoppt er die Zeichenfolge danach, Lesen und somit den verbleibenden Teil des Zeichenfolge : united, wurde der Variablen b zugewiesen, auch wenn das Programm nicht dazu auffordert, die Zeichenfolge für die Variable b einzugeben.

Wie spüe ich den verbleibenden Teil (der Teil nach dem Leerzeichen) der Zeichenfolge, die Variable a?

so dass ich eine ganz neue Eingabezeichenfolge für die Variable b eingeben kann.

Jede weitere Erklärung, was auch hier in der Ausführung des Codes passiert, wird sehr geschätzt.

Entschuldigung für die sehr grundlegenden Fehler (wie aus den Antworten hervorgeht) !! Nur ein Anfänger bis C-Programmierung :)

+4

Zu allererst und vor die Frage lesen, 'gets()' sollte nicht verwendet werden, und es hat sich in den letzten Versionen des [veraltet Tag: c] Standard. Ihr Code hat auch mehrere andere Probleme, wie die Verwendung von '&' operator, um ein Array für einen '"% s "' Spezifizierer an 'scanf()' zu übergeben. Wenn der Compiler, (* oder runtime ?, da ich niemals 'gets() verwenden würde' ich wusste nicht, dass es eine Warnung gab *) eine Warnung ausgibt, warum benutzt du sie weiter? –

+4

** Niemals ** benutzen 'gets'! Es wurde sogar vom C-Standard entfernt, was wirklich ein seltenes Ereignis ist. – Olaf

+0

'scanf ("% s ", b)' == 'bekommt (b)' == ein Loch, durch das dein Benutzer abstürzen oder die Kontrolle über dein Programm übernehmen kannst – PSkocik

Antwort

3

Sie es manuell durch das Lesen und Verwerfen Zeichen spülen können, bis Sie eine '\n' oder jemand trifft die entsprechende Tastenkombination finden eine EOF zu verursachen. Oder Sie können scanf() bitten, alles zu verwerfen, bis eine '\n' gefunden wird, kann der zweite wie diese

char string[20]; 
scanf("%19s%*[^\n]\n", string); 
erreicht werden

Es gibt andere Dinge über Ihren Code, die falsch sind

  1. Sie erklären a als ein Array von 20 char und dann übergeben Sie ihre Adresse an scanf(), wo es einen Zeiger von char erwartet, wird der Array-Name (die Variable, wenn Sie bevorzugen) automatisch in eine Pointe umgewandelt r zu char wenn es notwendig ist.

  2. Sie verwendeten gets(), es ist eine alte gefährliche und veraltete Funktion, die nicht mehr eine Standardfunktion ist. Sie sollten stattdessen fgets() verwenden, was einen Parameter erfordert, um das Überlaufen des Zielarrays zu verhindern.

Dies ist ein Beispiel testet die vorgeschlagenen Korrekturen

#include <stdio.h> 

int 
main(void) 
{  
    char string[20]; 

    string[0] = '\0'; /* Avoid Undefined behaviour 
         when passing it to `fprintf()' */ 

    scanf("%19s%*[^\n]\n", string); 
    fprintf(stdout, "%s\n", string); 

    fgets(string, sizeof(string), stdin); 
    fprintf(stdout, "%s\n", string); 

    return 0; 
} 
+0

Es ist besser, 'fscanf()' anstelle der problematischen 'scanf()' zu verwenden. – Destructor

+1

@Destruktor: Der einzige Unterschied zwischen 'fscanf()' und 'scanf()' ist, dass 'scanf()' von 'stdin' liest, während' fscanf() 'einen Parameter nimmt, der angibt, woher es liest. Wollten Sie vorschlagen, eine Zeile mit 'fgets()' zu lesen und dann mit 'sscanf' zu scannen? –