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() 的版本之一:

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 一遍又一遍地打印“输入命令:”,而没有给用户输入输入的机会。

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

尝试i在您的第二个read_flush实现中进行初始化。

于 2012-02-23T05:21:50.920 回答
1

在第二个版本中,您似乎没有像在第一个版本中那样将 i 初始化为零。所以它可能从一个大于 count 的垃圾值开始,因此循环永远不会执行。

于 2012-02-23T05:22:36.483 回答
1

两个版本都有相同的错误。您不要在字符串的末尾添加 NUL。malloc 不会初始化它返回的内存。

于 2012-02-23T05:24:52.353 回答