【发布时间】:2023-03-08 06:26:01
【问题描述】:
在Mark Lakata 指出我的问题中没有正确定义垃圾之后,我想出了这个。我会保持更新以避免混淆。
我正在尝试获取一个我可以在提示用户输入之前调用的函数,例如printf("Enter your choice:);,然后是scanf,并确保只有在提示之后输入的内容才会被scanf 扫描为有效输入。
据我所知,所需的功能是完全刷新标准输入。这就是我想要的。因此,出于此功能的目的,"garbage" 是用户输入中的所有内容,即在该用户提示之前的整个用户输入。
在 C 中使用 scanf() 时,总是存在输入缓冲区中存在额外输入的问题。所以我一直在寻找一个在每次 scanf 调用后调用的函数来解决这个问题。我使用this、this、this 和this 得到这些答案
//First approach
scanf("%*[^\n]\n");
//2ndapproach
scanf("%*[^\n]%*c");
//3rd approach
int c;
while((c = getchar()) != EOF)
if (c == '\n')
break;
所有这三个都在我所能找到的范围内工作,并通过参考文献。但在我的所有代码中使用其中任何一个之前,我想知道其中是否有任何错误?
编辑:
感谢Mark Lakata 在第三版中的一个错误。我在问题中更正了它。
EDIT2:
Jerry Coffin 回答后,我在代码中使用此程序测试了第 2 种方法:blocks IDE 12.11 using GNU GCC Compiler(编译器设置中未说明版本)。
#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
即在这个测试用例中都失败了。
【问题讨论】:
-
为什么标有优化?
-
@0x90 因为我想知道它们是否是最优的,如果不可能优化。
-
@0x90 当我从文件中读取大量输入时,接受的答案很好,但是当我读取非常小的输入(如 1 或 2 个整数)时,链接问题中的方法不会因为以下原因而不太理想调用 malloc 然后将字符串解析为整数?
-
Aseem,我认为您处理这个问题的方法不正确。什么是“垃圾”输入?你想读什么?你只是想跳过所有不是数字的东西吗?