0

私にはあまり時間がありませんstdin。この段階での答えよりも多くの疑問が生じます。の複数のインスタンスで渡される複数のタイプのコマンドをテストしたいと思っていましたscanf

私がこれを行う場合:

char inputChar;
char inputChars[15] = { NULL };
int inputInt;
double inputDec;

if(scanf("%c %d %lf",&inputChar,&inputInt,&inputDec) == 3) {
    ...
}
else if(scanf("%c %d %s",&inputChar,&inputInt,&inputChars) == 3) {
    ...
}
else if(scanf("%c %d",&inputChar,&inputInt) == 2) {
    ...
}
else if(scanf("%c",&inputChar) == 1) {
    ...
}
else {
    ...
}

次に、1 文字を入力して Enter キーを押すと、一致するかどうかを評価する前に、別の値を入力するまでコンソールが待機します。

アップデート

これは、使用されるたびに入力が完璧であることを期待することを除いて、うまくいくようです。ユーザーが入力して Enter キーを押す前にaa変更するとa 10、4 番目の評価に一致します。次の 2 つの理由から、これは間違っています。

  1. 入力を正しくキャプチャしている場合、3番目と一致するはずです。
  2. そうでない場合は、aa5 番目の評価にフィルターする必要があるためです。

改訂されたコード:

char input[50] = { NULL };

char inputChar = NULL;
char inputChars[15] = { NULL };
int inputInt;
double inputDec;

printf("Input String:\n>");

fgets(input,sizeof(input),stdin);

if(sscanf(input,"%c%d %lf",&inputChar,&inputInt,&inputDec) == 3) { }
else if(sscanf(input,"%c%d%s",&inputChar,&inputInt,&inputChars) == 3) { }
else if(sscanf(input,"%c%d",&inputChar,&inputInt) == 2) { }
else if(sscanf(input,"%c",&inputChar) == 1) { }
else { }

このようなことをすると、バックスペースが除外されていないことがわかります:

for(int i=0;i<50;i++) {
    if(input[i] == (char) 10) { break; }
    printf("\n%c %d",(char) input[i],(int) input[i]);
}

したがって、それfgetsは絵の外にあるようです。

4

3 に答える 3

2

ステートメントは順番に実行されます。したがって、それscanfはさらなる入力を待つ最初の呼び出しです。入力が最初の呼び出しと一致しない場合、次のscanf呼び出しが最初からやり直され、入力を待ちます。等々。

代わりにfgets、を使用して行全体を読み取り、その行で使用する必要がありsscanfます。

于 2013-02-26T06:33:15.120 に答える
1

「入力バッファをクリアする」とはどういう意味か説明してください。_flushallがキーストロークを発生する前に消去するということですか?どうすればこれができますか?おそらく、行から必要なデータをすでに読み取っており、行の残りの部分については気にしないことを意味します。その場合は、「次の改行までのすべての文字を読み取って破棄する」ことをお勧めします。私はそれを行うためのポータブルメカニズムを持っています:

for (int c = getchar(); c >= 0 && c != '\n'; c = getchar());

この関連する回答を読むこともできます。

編集:あなたが望む行動が次のように表現されるかもしれないということが私にちょうど起こりました:

char inputChar;
char inputChars[15] = { NULL };
int inputInt;
double inputDec;
int x = scanf("%c%d", &inputChar, &inputInt);

if (x == 2 && scanf("%lf",&inputDec) == 1) {
    ...
}
else if (x == 2 && scanf("%14s", inputChars) == 1) {
    ...
}
else {
    ...
}
于 2013-02-26T07:31:13.803 に答える
0

おそらく最善の方法ではありませんが、うまくいきます。

iostreamライブラリ runを使用してgetline(std::cin,input);入力をキャプチャし、 on で何度でもstd::string input使用します。sscanfinput.c_str()

于 2013-03-01T15:10:09.230 に答える