【问题标题】:Reading input from fgetc() and printing with printf()从 fgetc() 读取输入并使用 printf() 打印
【发布时间】:2012-02-23 05:15:21
【问题描述】:

好的,我确定我在这里遗漏了一些东西,但我不知道它是什么,我希望有人能帮我弄清楚。

我正在从命令行读取输入,并且正在编写一个使用 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 一遍又一遍地打印“Enter command:”,而没有给用户输入输入的机会。

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() 的哪些微妙之处?

【问题讨论】:

    标签: c loops printf stdin fgetc


    【解决方案1】:

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

    【讨论】:

    • 哇,哎呀。是的,就是这样。
    • 最好养成始终初始化变量的习惯,尤其是在使用指针时。它将为您省去很多麻烦。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-17
        • 2019-01-31
        • 1970-01-01
        • 2014-02-16
        • 2011-09-14
        • 2023-03-28
        相关资源
        最近更新 更多