1

さて、ここで私が見逃しているものがあると確信していますが、それが何であるかはわかりません。誰かがそれを理解するのを手伝ってくれることを願っています。

コマンドラインから入力を読み込んでいて、fgetc()を使用してそれを行う関数を書いていました。ただし、一見表面的な機能の変更により、動作が完全に異なります。

これはmain()関数です:

while(1)
{
     char* cmd = malloc(sizeof(char) * 80);
     printf("Enter command: ");
     read_flush(cmd, 80);
     printf("%s\n", cmd);
     free(cmd);
}

そして、これはread_flush()のバージョンの1つです。

int read_flush(char* buffer, int count)
{
    int i, c;
    for(i = 0; i < count; i++)
    {
        c = fgetc(stdin);
        if(c == '\n' || c == EOF)
            return i;
        buffer[i] = (char)c;
    }

    return i;
}

これは問題なく動作します。入力を入力すると、吐き出されます。ただし、この次のバージョンでは、mainは、ユーザーに入力を入力する機会を与えずに、「Entercommand:」を繰り返し出力します。

int read_flush(char* buffer, int count)
{
    int i, c;
    while(i < count)    
    {
        c = fgetc(stdin);
        if(c == '\n' || c == EOF)
            return i;
        buffer[i] = (char)c;
        i++;
    }

    return i;
}

ここでfgetc()の微妙な点が欠けていますか?

4

3 に答える 3

1

i2 番目のread_flush実装 で初期化してみてください。

于 2012-02-23T05:21:50.920 に答える
1

2 番目のバージョンでは、最初のバージョンのように i をゼロに初期化していないようです。そのため、カウントより大きいガベージ値で始まる可能性があり、ループは実行されません。

于 2012-02-23T05:22:36.483 に答える
1

どちらのバージョンにも同じエラーがあります。文字列の末尾に NUL を追加しません。malloc は、返されるメモリを初期化しません。

于 2012-02-23T05:24:52.353 に答える