gpt4 book ai didi

c - 每次输入后刷新标准输入 - 哪种方法没有错误?

转载 作者:太空狗 更新时间:2023-10-29 17:19:17 26 4
gpt4 key购买 nike

Mark Lakata 指出我的问题中没有正确定义垃圾后,我想到了这个。我会及时更新以避免混淆。


我正在尝试获得一个可以在提示用户输入之前调用的函数,例如 printf("Enter your choice:); 之后是 scanf 并确定只有在提示后输入的内容才会被 scanf 扫描为有效输入。

据我所知,所需的功能是完全刷新标准输入的功能。这就是我想要的。因此,出于此功能的目的,“垃圾” 是用户输入中的所有内容,即在该用户提示之前的整个用户输入。


在 C 中使用 scanf() 时,输入缓冲区中总是存在额外输入的问题。所以我一直在寻找一个我在每次 scanf 调用后调用的函数来解决这个问题。我用了this , this , thisthis得到这些答案

//First approach
scanf("%*[^\n]\n");

//2ndapproach
scanf("%*[^\n]%*c");

//3rd approach
int c;
while((c = getchar()) != EOF)
if (c == '\n')
break;

据我所知,所有这三个都可以通过试验和引用资料找到。但是在我的所有代码中使用其中任何一个之前,我想知道其中是否有任何错误?

编辑:

感谢Mark Lakata对于第三个错误。我在问题中更正了它。

编辑2:

Jerry Coffin 之后回答我在代码中使用此程序测试了第一种和两种方法:使用 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

即在这个测试用例中都失败了。

最佳答案

前两个略有不同:它们都读取并忽略直到换行符的所有字符。然后第一个跳过所有连续的空白,所以在它执行后,您读取的下一个字符将是非空白。

第二个读取并忽略字符,直到遇到换行符,然后再读取(并丢弃)恰好一个字符。

如果您有(例如)双倍行距的文本,就会出现差异,例如:

line 1

line 2

假设你读到第一行中间的某个地方。如果你然后执行第一个,你读入的下一个字符将是第二行的'l'。如果你执行第二个,下一个字符你读入将是第 1 行和第 2 行之间的换行符。

至于第三个,如果我要这样做,我会做类似的事情:

int ch;
while ((ch=getchar()) != EOF && ch != '\n')
;

...是的,这确实可以正常工作——&& 强制一个序列点,所以它的左操作数首先被评估。然后是一个序列点。然后,当且仅当左操作数的计算结果为 true 时,它才会计算其右操作数。

至于性能差异:由于您是从处理 I/O 开始的,所以几乎没有合理的问题是所有这些都将始终受 I/O 限制。尽管表面上看很复杂,scanf(和公司)通常是经过多年使用并经过精心优化的代码。在这种情况下,手动循环可能会慢很多(例如,如果 getchar 的代码没有得到内联扩展)或者它可能速度差不多。如果编写您的标准库的人不称职,那么它有可能明显更快的唯一方法。

就可维护性而言:IMO,任何声称了解 C 的人都应该知道 scanf 的扫描集转换。这既不是新的也不是火箭科学。不知道这一点的人真的不是称职的 C 程序员。

关于c - 每次输入后刷新标准输入 - 哪种方法没有错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17248442/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com