精简版
我想从 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)
并且输入的字节数多 SIZE
, fgets
将获取输入的 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/