4

私はcプログラミングに不慣れで、プログラムでこの問題に直面して
います。入力バッファーからcharを取得するループがあります。

while(c = getchar()){
    if(c == '\n') break;
    if(c == '1') Add();
    if(c == '2') getInput(); // this is where the headache starts
    ....
}

これがgetInput()関数です

void getInput()
{ 
    char ch = getchar();
    if(ch == '1') doSomething();
    ....
}

ただし、getInput()関数からgetchar()を呼び出すと、getchar()の最後の呼び出しから入力バッファーに残った文字のみが取得されます。そして、私がやりたいのは、新しく入力された文字を取得することです。

私は入力バッファをクリアするための適切な方法を2時間グーグルしてきましたが、何も役に立ちませんでした。したがって、チュートリアルや記事などへのリンクは非常に高く評価されています。これを実装する別の方法がある場合は、教えてください。

4

2 に答える 2

1

これはうまくいくはずです:(入力バッファをクリアする例)

#include <stdio.h> 

int main(void)
{
  int   ch;
  char  buf[BUFSIZ];

  puts("Flushing input");

  while ((ch = getchar()) != '\n' && ch != EOF);

  printf ("Enter some text: ");

  if (fgets(buf, sizeof(buf), stdin))
  {
    printf ("You entered: %s", buf);
  }

  return 0;
}

/*
 * Program output:
 *
 Flushing input
 blah blah blah blah
 Enter some text: hello there
 You entered: hello there
 *
 */
于 2012-12-05T18:17:00.090 に答える
1

まず、このコードの条件には、代入演算子で==はなく比較演算子があります。=if

while(c = getchar()){
    if(c = '\n') break;
    if(c = '1') Add();
    if(c = '2') getInput(); // this is where the headache starts
    ....
}

入力の取得を停止するEOFには、キーボードから prssing で指定できるものを試してくださいCTRL+D

EDIT : 問題は、キーボードのキー\nを押したときに実際に入力として取得される にあります。ENTERしたがって、コードを 1 行だけ変更します。

if (c ==\n ) break;toif (c == EOF ) break;と私が言ったようEOFに、入力の終わりです。

その後、コードは正常に動作します。

コードの流れ:

step 1: suppose `2` is input 
step 2: getInput() is called
step 3: suppose `1` as input  // in getInput
step 4: doSomething() is called  // from getInput
step 5: After completion of doSomething again come back to while loop , 

but in your case you have already given `\n` character as an input 

when you pressed `1` and `ENTER`.And thus loop terminates.

しかし、私が言ったようにコードを変更した後、これはうまくいくはずです。

注: コード フローを理解し、デバッグを目的としてprintf()、関数内のさまざまな場所に配置し、実行中の行と実行していない行の出力を確認することをお勧めします。

于 2012-12-05T18:20:17.060 に答える