3

私は次のコードを書きました:

int N;
scanf("%d", &N);
int i;
for (i = 0; i < N; i++) {
  char line[LINE_MAX];
  if (fgets(line, LINE_MAX, stdin) != NULL) {
    // do stuff with line here
    printf("%c - %c\n", line[0], line[1]);
  }
}

行数を含む入力ファイルがあり、その後に処理したい行数が続きます。だから私は行数をに読みましたN。その後、私はfgetsそれを処理できるようにラインを取得するために使用します。

ただし、fgets初めてstdinを待つようには見えません。私は常にの出力を取得し-、それから入力を待ちます。つまり、ループの最初の反復であり、での標準入力を待機せず、私のようにfgets区切られた2つの空の文字を出力するだけです。-printf

何故ですか?fgets毎回入力を待つにはどうすればよいですか?スレッドの問題のように感じます。

4

3 に答える 3

6

fflush()次のように、scanf()の直後にを呼び出すことができます。

int N;
scanf("%d", &N);
fflush (stdin);
int i;
... (rest of code)...

したがって、改行文字はstdinバッファから消去され、次の文字fgets()は入力を求めるために停止します。

于 2013-11-20T00:55:55.827 に答える
5

geekosaurが言ったように、あなたはによって残された改行を処理していませんscanf。フォーマット文字列を変更して、次のscanfことを考慮に入れることができます。

scanf("%d *[^\n]", &N);

*[^\n]改行ではない整数入力の後のすべてを無視するように言いますが、改行では何もしません(スキップします)。

テストプログラムの出力:

emulawsk@cs:~/testing$ ./test2
3
13
1 - 3
26
2 - 6
59
5 - 9
于 2012-04-14T19:41:10.110 に答える
3

それは糸脱毛とは何の関係もありません。 scanf()あなたがそれを求めるものを正確に読みます。それは他のすべてを未読のままにします、特にデータに続く改行。(また、ユーザーが意図したとおりに入力しなかった可能性にも対処していません。)

行指向の入力を行う場合は、を使用しますfgets()。使用しないでくださいscanf()。システムが、読んでいないものを無視したいという魔法のように直感できることを期待してください。

于 2012-04-14T19:36:25.043 に答える