3

学校向けのプログラムを書いています。Cを扱うのは初めてです。

fgets を使用して入力を読み取っていますが、fgets がブロックされないことがあります (プログラムが無限ループに陥ります)。みんなの最初の質問に答えるために、いいえ、\nこの問題の原因となる余分なものを残して事前にscanfを使用していません。ある時点でsscanfを使用していますが、それはfgetsに関連しているため、問題ではないと思います。

ソケットを扱うために与えられたコードがいくつかあります。私はそれを調べましたが、問題の原因を見つけることができません。コードは長いため含まれていませんが、参考になる場合は含めることができます。

簡単に言うと、scanfの問題以外に、fgetsが入力をブロックしない理由はありますか? どんな助けでも大歓迎です!

編集:これをもっと明確にするべきでしたが、この場合、標準入力のみに fgets を使用しています。

4

2 に答える 2

0

Cのほとんどの標準関数と同様に、何が起こっているのかを理解するために少し掘り下げる必要があります。開始するのに最適な場所は、関数のドキュメントです。

fgets()ドキュメント

このドキュメントから、fgetsが3つのパラメーターを取り、char*を返すことがわかります。パラメータが正しいと仮定すると、関数は、改行文字またはファイルの終わりマーカーに到達するまでストリームから読み取ります。成功した場合、戻りコードはstrパラメーターへのポインターになります。

ただし、おそらくもっと興味があるのは失敗の場合です。失敗すると、関数はNULLを返します。障害がどの程度正確に発生しているかを判断するには、ファイルエラーインジケータをチェックして、メッセージが出力されているかどうかを確認する必要があります。これは次のように実行できます。

if ( fgets (mystring , 100 , pFile) == NULL )
{
    // We handle error here
    if (ferror (pFile))
    {
        printf ("We encountered an error!\n");
        perror ("Error message");
    }
}

ここから、何が起こっているのかを判断できるはずです。考えられる原因は、無効なパラメーター、または予期された形式/条件にないパラメーターです。

于 2013-01-14T23:54:12.133 に答える
0

これは古い質問であることは知っていますが、この問題が発生したときに見つけたものを共有したいと思いました。あなたのコードがなければ、これがあなたと同じ問題であるかどうかはわかりませんが、自分のコードで見つけたのは、close()0 に設定されたファイル記述子で使用していたことです。システムと低いと見よ stdin は FD 0 ( http://en.wikipedia.org/wiki/File_descriptor )。これを解決する方法はたくさんあると思いますが、私の場合は、単純な if ステートメントを閉じて使用しました。

if(fd > 2)
{
close(fd);
}
于 2013-03-05T15:44:53.860 に答える