我们什么时候需要清除scanf缓冲区?

时间:2015-09-04 08:22:49

标签: c scanf

我一直以为"' \ n'在缓冲区"问题只发生在我们读字符时, 但是,我用以下代码偶然发现了这个问题:

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读取整数, 但是当我输入无效的东西时,这段代码仍然陷入无限循环。 如果我清理缓冲区,它就会被修复。

所以我的问题是,这是&#34;&#39; \ n&#39;在缓冲区&#34;发一般的事情? 或者它只发生在特殊用途上? 如果它只发生在特殊用途中,是否需要遵循一些一般性指导原则?

1 个答案:

答案 0 :(得分:5)

一般准则是不使用*scanf()进行用户输入。您从格式错误的输入中优雅地恢复的能力太有限,错误的可能性太高(从*scanf()相关问题的相关问题可以看出这一点)。 *scanf()函数系列最适用于读取格式良好的输入(即以前由您自己的应用程序编写的数据)。

用户输入无论如何都是基于行的,至少如果您依赖于标准输入功能。

所以使用fgets()读取整行输入,然后在内存中解析。像strtol()strtod()这样的函数可以提供非常具体的反馈,在这一点上,他们可以完全停止解析,您可以跳过并尝试不同的解析,您拥有所有string-handling functions标准处理以分开用户的输入。如果事情变成梨形,你可以在错误信息中重复整行输入,添加你喜欢的解析尝试的任何信息。