2016-10-09 7 views
0

Ich bin neu in c, und ich bin mir nicht sicher, wie diese Frage zu formulieren. Aber zum Beispiel mit diesem Code:Wie vermeidet man Benutzereingaben mit zwei scanf?

#include <stdio.h> 

int main() 
{ 
    int x,y,z; 

    printf("Enter 2 numbers: "); 
    scanf("%d %d", &x, &y); 

    printf("Test: "); 
    scanf("%d",&z); 

    printf("x:%d y:%d z:%d\n",x,y,z); 

    return 0; 
} 

Wenn der Benutzer der Eingänge "1 2 3", wäre es x = 1, y = 2 und z = 3. Ich habe mich gefragt, ob du x = 1 und y = 2 setzen und 3 ignorieren kannst, dann kann der Benutzer einen anderen Wert eingeben und nicht die 3, die vorher gegeben wurden, benutzen.

+6

Sie können den Eingang nach dem ersten scanf spülen. [Siehe hier] (http://stackoverflow.com/questions/7898215/how-to-clear-input-buffer-in-c). –

+5

Sie können ['fgets()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/fgets.html) (oder POSIX ['getline()'] (http: //pubs.opengroup) verwenden .org/onlinepubs/9699919799/functions/getline.html)) um eine Zeile zu lesen und dann mit ['sscanf()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/sscanf.html) anstelle von 'scanf()'. Dies ist oft eine bessere Möglichkeit, Daten zu verarbeiten. Sie können Fehler besser melden und alternative Möglichkeiten zum Scannen der Daten ausprobieren, wenn das erste Format nicht funktioniert. –

+1

Stimmen Sie völlig mit @ JonathanLeffler überein: Sie sollten 'fgets()' verwenden, um eine Zeile zu erhalten, dann 'sscanf() ', um es sorgfältig zu verarbeiten (die Rückgabewerte von diesen Funktionen natürlich überprüfen). –

Antwort

0

werden Sie Dieser Code helfen:

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    int x,y,z; 
    char s[1024]; 

    printf("Enter 2 numbers: "); 
    scanf("%d %d", &x, &y); 
    fgets(s, 1024, stdin); 

    printf("Test: "); 
    scanf("%d",&z); 

    printf("x:%d y:%d z:%d\n",x,y,z); 

    return 0; 
} 

Es initialisiert einen String-Zeiger mit 1024 bytes und nach auf dieser Linie die ersten beiden Zahlen ignorieren den restlichen Inhalt lesen, dann Test: Aufforderungen und liest z Variable.

BEARBEITEN Verwenden Sie den folgenden Code, wie ich es mit der Zeile 0 <= lentgh <= 8.1k characaters getestet habe!

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    int x,y,z; 
    char ch; 

    printf("Enter 2 numbers: "); 
    scanf("%d %d", &x, &y); 
    while(scanf("%c", &ch)) if(ch == '\n') break; 

    printf("Test: "); 
    scanf("%d",&z); 

    printf("x:%d y:%d z:%d\n",x,y,z); 

    return 0; 
} 
+1

Verwenden Sie nie 'gets()'. Nie, nie, nie! –

+0

@ JonathanLeffler, gib mir eine Alternative ':)'. –

+0

Siehe [Warum 'gets()' ist so gefährlich, es sollte nicht verwendet werden - immer] (http://stackoverflow.com/questions/1694036/why-is-the-gets-function-wargerous-why-should-it-not-be-used) für eine Liste von Alternativen. –

Verwandte Themen