4

次の C コードの実行

#include <stdio.h>
int main(int argc, char **argv) {
  char stdinput[10];
  while (1) {
    fgets(stdinput, 10, stdin);
    fputs(stdinput, stdout);
  }
}

生成:

コンソールで:

./a.out
input
input

その後、さらに入力を待ちます。つまり、 と同様に、stdin を stdout にエコーしcatます。

パイプで:

echo input | ./a.out
input
input
input
[...]

開始されると、操作なしで単独でコンソールをフラッディングします。

このサンプル プログラムは、まさに私がテストに使用したものです。それはカットではありません。2 つのテストが同じように動作することを期待します。何が起こっていますか?

4

3 に答える 3

7

EOF達すると、fgets入力を待つ (またはバッファを変更する) ことなく、すぐに NULL を返します。したがって、無限ループになります。あなたのパイプの場合、echoはパイプが書き込まれるとパイプを閉じ"input\n"、結果として EOF になります。

fgets通話を次のように変更します

if(fgets(stdinput, 10, stdin) == NULL)
    break;
于 2012-09-21T08:43:27.673 に答える
6

fgetsループ条件を呼び出しで置き換えるだけで、次のようになります。

#include <stdio.h>
int main(int argc, char **argv) {
  char stdinput[10];
  while (fgets(stdinput, 10, stdin)) {
    fputs(stdinput, stdout);
  }
}

これは、EOF を取得するまでループします。その場合、 @nneonneo が言っfgets()たように NULL を返します。しかし、この条件では、あなたのを壊す必要はありません.while()

于 2012-09-21T08:49:21.023 に答える
0

[: 間違った問題を解決します。]

http://sweslo17.blogspot.tw/2012/04/c-standard-input-redirection.htmlを参照してください。

の後fgets()、以下のコードを追加してstdin再度復元し、パイプの問題を解決できます。

freopen("/dev/tty","rb",stdin);
于 2014-01-28T00:31:47.880 に答える