在Mark Lakata
指出我的问题中没有正确定义垃圾之后,我想出了这个。我会保持更新以避免混淆。
我正在尝试获取一个函数,我可以在提示用户输入之前调用该函数,例如printf("Enter your choice:);
follow a scanf
,并确保只有在提示之后输入的内容才会被扫描scanf
为有效输入。
据我所知,所需的功能是完全刷新标准输入的东西。这就是我想要的。因此,出于此功能的目的,"garbage"
用户输入中的所有内容,即在该用户提示之前的整个用户输入。
在 C 中使用scanf()
时,总是存在输入缓冲区中存在额外输入的问题。所以我一直在寻找一个在每次 scanf 调用后调用的函数来解决这个问题。我用这个,这个,这个和这个来得到这些答案
//First approach
scanf("%*[^\n]\n");
//2ndapproach
scanf("%*[^\n]%*c");
//3rd approach
int c;
while((c = getchar()) != EOF)
if (c == '\n')
break;
所有这三个都在尽我所能找到,并通过参考文献进行。但是在我的所有代码中使用其中任何一个之前,我想知道其中是否有任何错误?
编辑:
感谢Mark Lakata在 3rd 中的一个错误。我在问题中纠正了它。
编辑2:
在Jerry Coffin回答后,我在代码中使用该程序测试了第 2 种方法:使用 GNU GCC 编译器阻止 IDE 12.11(编译器设置中未说明版本)。
#include<stdio.h>
int main()
{
int x = 3; //Some arbitrary value
//1st one
scanf("%*[^\n]\n");
scanf("%d", &x);
printf("%d\n", x);
x = 3;
//2nd one
scanf("%*[^\n]%*c");
scanf("%d", &x);
printf("%d", x);
}
我使用了以下 2 个输入
第一个测试输入(2 个换行符,但垃圾输入中间没有空格)
abhabdjasxd
23
bbhvdahdbkajdnalkalkd
46
printf
首先,我通过语句得到以下输出
23
46
即两个代码都工作正常。
第二个测试输入:(垃圾输入中间有空格的2个换行符)
hahasjbas asasadlk
23
manbdjas sadjadja a
46
printf
第二次我通过语句得到以下输出
23
3
因此我发现第二个不会处理额外的垃圾输入空白。因此,它对垃圾输入并不是万无一失的。
我决定尝试第三个测试用例(垃圾在非空白字符之前和之后包括换行符)
``
hahasjbas asasadlk
23
manbdjas sadjadja a
46
答案是
3
3
即在这个测试用例中都失败了。