C: Stdin - 删除多余数据

标签 c stdin fflush

精简版

我想从 stdin 中删除多余的用户输入,但我知道不建议使用 fflush(stdin)。我找到了这个替代品:

int ch;
while ((ch = getchar()) != '\n' && ch != EOF);

但是,如果没有多余的数据要删除,这将删除用户的下一个输入。如何检查是否有数据要从 stdin 中删除,以便我可以选择是否使用这种清除缓冲区的方法?

带解释的长版

我正在使用 Obj-C/C 制作一个命令行工具。

我理解声明 char str[SIZE] 语法会将 SIZE 字节的内存分配给 str。我想为每个变量分配尽可能少的内存,以避免浪费内存。

但是,如果您使用 fgets(str,sizeof(str),stdin) 并且输入的字节数 SIZEfgets 将获取输入的 SIZE 字节并将其存储在 str 中,将所有其他数据留在缓冲区中。如果您再次调用 fgets,剩余的数据将存储在您作为 fgets 的第一个变量传递的变量中,并且基本上完全跳过提示。我不希望这发生。一个常见的解决方案是 fflush(stdin)

各种互联网资源(包括 SO)声明使用 fflush(stdin) 不是一个好主意,因为当您将输入流作为参数传递时它是“未定义的”。

我在 CProgramming.com 上找到了这个替代品

int ch;
while ((ch = getchar()) != '\n' && ch != EOF);

但是,同一来源提到,如果 stdin 中没有多余的数据需要清除,它将在用户的下一次输入时执行此操作,因此第二次 fgets 被调用它可能无法接收所有数据。

如何检查 stdin 中是否有数据,以便决定是否清除它?

最佳答案

如果您使用 fgets阅读行,并且您担心您可能没有阅读整行,请记住如果 fgets读取整行换行符应该是输入缓冲区中的最后一个字符。

例子:

char smallBuffer[10];
while (fgets(smallBuffer, sizeof(smallBuffer), stdin) != NULL)
{
    if (strlen(smallBuffer) > 0)
    {
        // Check if we got the whole line
        if (smallBuffer[strlen(smallBuffer) - 1] == '\n')
        {
            // Yes, we got the whole line
        }
        else
        {
            // Whole line not read, there is still "excess" input
        }
    }
}

关于C: Stdin - 删除多余数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25526856/

相关文章:

c - 当 dest 小于 src 但大到足以容纳 src 的所需子字符串时,为什么 strncpy() 会产生垃圾?

node.js - Bash + Node.js + stdin/stdout 重定向 : error "not a tty"

c - 为什么要在 C 的字符串输入中使用 int 类型的变量?

c - 为什么我的 fflush 不起作用?跳过循环中询问字符串

c++ - 由于段错误,我的程序在 fflush 上崩溃,...但并非总是如此?

C struct和malloc问题(C)

c - IAR工作台内存泄漏分析(EWARM)

c++ - 一个通用的集合操作类,即交集、并集、减号等

c - fflush(stdin) 函数不起作用

c - 缓冲区刷新不适用于 printf 函数