2016-10-03 6 views
0

Ich habe hier einen Code, der einige unerwünschte Verhalten bei der Eingabe von Zeichenfolgen mit Leerzeichen hat. zB print illegal_argument. Wenn eine Eingabe mit mehreren Wörtern kommt, möchte ich, dass nur das erste Wort registriert wird.Scanf Eingang überträgt zum nächsten scanf

Was derzeit geschieht, ist:

[email protected] $ print 0 
Enter router ID for information > ID: 0, flag: f7, model_length: 13, model: D-Link y6000 

Es registriert die erste print für den Vergleich in der Befehlsschleife. Aber anstatt scanf den Benutzer für die nächste Eingabeaufforderung aufzufordern, ignoriert es stattdessen dies und nimmt das zweite Wort/die Nummer, die von dem Benutzer von dem vorherigen scanf eingegeben wird, an.

Was ich will geschehen ist:

[email protected] $ print 0 
Enter router ID for information > 0 
ID: 0, flag: f7, model_length: 13, model: D-link y6000. 

Alles sonst wie vorgesehen funktioniert, aber ich frage mich, ob es ein einfacherer Weg, dies zu tun. Ich habe versucht, Strtok zu benutzen, ohne viel Glück.

char input[256]; 
printf("%[email protected] $ ", getenv("USER")); 
scanf("%s", input); 

if(strcmp(input, "print") == 0) { 
    print(); 
} 

Der obige Code ist, wie ich die Eingabe vom Benutzer erhalten.

Wer hat irgendwelche Ideen?

+2

Wenn Sie die gesamte Eingabezeile verwenden möchten, verwenden Sie nicht "scanf", sondern "fgets". –

+0

@OlafDietsche Probieren 'fgets (input, 256, stdin)' funktioniert nicht, es sei denn, ich mache etwas falsch. Der Versuch, '$ print' zu erzeugen, erzeugt': command not found.'. –

+0

@Christian S 'fgets (Eingabe, 256, stdin)' funktioniert. Andere Dinge im Code müssen sich ebenfalls ändern. Siehe http://stackoverflow.com/questions/2693776/removing-trailing-newline-character-from-fgets-input – chux

Antwort

1

Nachdem der scanf() den ersten Eingabewert übernommen hat, wird der Rest im Eingabestream belassen. Versuchen Sie, diese um die restlichen Zeichen zu verwerfen:

int ch; 
while ((ch = getchar()) != '\n' && ch != EOF) 
    continue;    // discard remaining characters 

Wenn Sie diese Zeilen vor der nächsten Lese von stdin setzen, die zusätzlichen Zeichen werden Ihre Eingabe nicht beschädigt.

+0

Hinweis: Am Ende der Datei 'while (getch()! = '\ N')' ist eine Endlosschleife. – chux

+0

True @chux, aber eine Zeile der Benutzereingabe vom Terminal endet immer mit einem '\ n', nicht wahr? –

+0

"Eingabe vom Terminal endet immer mit einem '\ n'," -> nicht _always_. Das Verhalten ist implementierungsspezifisch. – chux