2

私はこの関数を書きました:

char* input(char* buffer, FILE* fp)
{
    char* result=fgets(buffer,LMAX,fp);
    if(result!=NULL)
    {
    const unsigned int length=strlen(buffer);
    if(buffer[length-1]=='\n')
        buffer[length-1]='\0';
    }
    return result;
}

fp が stdin と等しい場合、テキスト行を入力するだけです。
私はそれを何度も使用しましたが、うまくいきます。
fp が FILE ポインターの場合にのみ fgets の結果を取得するため、ストリームが入力操作に適していない場合は、結果が NULL でないことを確認する必要があります。
問題は、次のように使用する場合です。

char buffer[LMAX];  // LMAX = 100, defined constant
input(buffer,stdin);
puts(buffer);

入力が "#dest :a" のような場合、puts は "#dest" を出力し、残りの文字列を切り取ります。大きな問題は、この関数が機能していて、1 時間前 (同じだった) に取り込んだ場合です。 「#dest :a」のような文字列を入力すると、puts は「#dest :a」と出力されました。また、何も変更されていません。また、デバッグを試みて、次のように記述した場合:

char* input(char* buffer, FILE* fp)
{
    char* result=fgets(buffer,LMAX,fp);
    puts(buffer);  //prints always "#dest :a"
    if(result!=NULL)
    {
    const unsigned int length=strlen(buffer);
    if(buffer[length-1]=='\n')
        buffer[length-1]='\0';
    }
    return result;
}

問題は、関数内で "#dest :a" が出力されることです。
この関数は機能する場合と機能しない場合があります。私は KO です。非決定論的な動作に耐えられません。この問題 (およびおそらくバグ) の原因は何ですか?

4

1 に答える 1

1

コードを数回実行しましたが、正しい出力しか得られないため、問題を再現できません。私は問題が何であるかを知っていると思います。電話してみる

    flush(stdin);

入力する呼び出しの前に。

于 2012-05-29T16:04:08.017 に答える