2016-10-03 3 views
0

私はここにスペースを含む文字列を入力するときに望ましくない動作をするコードを持っています。例:print illegal_argument。複数の単語を含む入力が来たら、最初の単語だけを登録したいと思います。現在、何が起こるScanfの入力が次のscanfに引き継がれます

は次のとおりです。

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

それは、コマンド・ループで比較するための最初のprintを登録します。しかし、ユーザに次の入力を促すscanfの代わりに、それは無視され、前のscanfからのユーザによって入力された2番目の単語/番号を取ります。それ以外の場合は意図したとおりに

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

すべてが動作しますが、これを行うための簡単な方法があります場合、私は疑問に思う:

は何が起こるたいのです。 Strtokを使ってみましたが、大したことはありませんでした。

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

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

上記のコードは、ユーザーからの入力方法です。

誰でもアイデアがありますか?

+2

入力行全体が必要なときは、 'scanf'を使わず、代わりに' fgets'を使います。 –

+0

@OlafDietsche私が間違っていない限り、 'fgets(input、256、stdin)'を試しても動作しません。 '$ print'を実行すると、':command not found.'が生成されます。 –

+0

@Christian S 'fgets(input、256、stdin)'が動作します。コード内の他のものも変更する必要があります。 http://stackoverflow.com/questions/2693776/removing-trailing-newline-character-from-fgets-input – chux

答えて

1

scanf()が最初の入力値を受け取ると、残りの入力ストリームが入力ストリームに残ります。残りの文字を破棄し、これを試してみてください:

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

あなたはstdinから次の読み取り前に、これらのラインを入れた場合は、余分な文字が破損していないでしょう、あなたの入力。

+0

注:ファイルの終わりでは、while(getch()!= '\ n') 'は次のようになります。無限ループ – chux

+0

真の@chuxですが、端末からのユーザ入力の行は常に '\ n'で終わります。そうではありませんか? –

+0

"端末からの入力は常に '\ n'で終わりますが、" - > not_always_です。動作は実装固有です。 – chux