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

nan*_*lee 4 c scanf

我一直以为“'\ 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;
}
Run Code Online (Sandbox Code Playgroud)

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

所以我的问题是,这是“'\ n'缓冲区”问题吗?还是仅在特殊用途下发生?如果仅在特殊用途下发生,我是否需要遵循一些一般准则?

Dev*_*lar 5

一般准则是不要*scanf()用于用户输入。您从错误格式的输入中正常恢复的功能太有限,出错的机会也很高(可以从*scanf()SO上与之相关的大量问题中看到)。该*scanf()功能的家庭最好只用于读取格式良好的输入(先前被自己的应用程序编写即数据)。

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

因此,请使用fgets()读取完整的输入行,然后在内存中进行解析。诸如strtol()或之类的函数strtod()可以提供非常具体的反馈,此时它们恰好停止了解析,您可以跳回并尝试其他解析,您可以使用标准的所有字符串处理函数来区分用户的输入。而且,如果事情变得一团糟,您可以在错误消息中重复整个输入行,在您喜欢的解析尝试中添加任何信息。