C:标准输入 - 去除多余的数据(C: Stdin - Removing Excess Data)

2019-10-20 19:18发布

简洁版本

我想摆脱多余的,从用户输入的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 ,所以我可以决定是否要清除它?

Answer 1:

如果您使用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 - Removing Excess Data
标签: c stdin fflush