C语言 什么时候需要清空扫描缓冲区?



我一直认为"'n' in buffer"问题只发生在我们读取字符时,然而,我偶然发现了这个问题与以下代码:

int main(int argc, char** argv){
    int height = 0, width = 0;
    while(height < 1 || height > 10|| width < 1 || width > 15){
        printf("Please insert the height(1~10) and width(1~15) of the parallelogram (integers): ");
        if(scanf("%d %d", &height, &width) != 2){
            height = width = 0;
        }
    }
    return 0;
}

如上所述,我只使用scanf读取整数,但是当我输入一些无效的东西时,这段代码仍然会陷入无限循环。如果我清除缓冲区,它是固定的。

所以我的问题是,这个"'n'在缓冲区"问题是一个一般的事情吗?还是只有在特殊情况下才会发生?如果它只发生在特殊的用法中,我是否需要遵循一些一般的指导原则?

一般原则是不使用*scanf()作为用户输入。您从格式不良的输入中优雅地恢复的能力太有限了,出错的可能性太高了(从SO上大量与*scanf()相关的问题可以看出)。*scanf()函数族最好只用于读取格式良好的输入(即以前由您自己的应用程序写入的数据)。

用户输入无论如何都是基于行的,至少如果你依赖于标准输入函数。

所以使用fgets()读取一整行输入,然后在内存中解析它。像strtol()strtod()这样的函数可以给出非常具体的反馈,当它们停止解析时,您可以跳过并尝试不同的解析,您可以使用标准的所有字符串处理函数来挑选用户的输入。如果情况不妙,您可以在错误消息中重复整行输入,添加您喜欢的有关解析尝试的任何信息。

最新更新