C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了每次输入后刷新stdin – 哪种方法不是错误的?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在Mark Lakata指出在我的问题中没有正确定义@L_874_0@之后我想出了这个.我会保持更新,以避免混淆.

我正在尝试获取一个函数,我可以在提示用户输入之前调用printf(“输入您的选择:);后执行scanf并确保只有在提示后输入的内容才会被scanf扫描为有效输入.

据我所知,所需的功能是完全冲洗标准输入的东西.这就是我想要的.因此,出于该功能的目的,“@L_874_0@”是用户输入中的所有内容,即在该用户提示之前的整个用户输入.

在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第3个错误.我在问题中纠正了它.

EDIT2:

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个换行但在@L_874_0@输入中间没有空格)

abhabdjasxd


23
bbhvdahdbkajdnalkalkd



46

对于第一个,我得到了printf语句的以下输出

23
46

即两个代码都正常工作.

第二个测试输入:(2个在@L_874_0@输入中间有空格的换行符)

hahasjbas asasadlk


23
manbdjas sadjadja a


46

对于第二个,我得到了printf语句的以下输出

23
3

因此我发现第二个不会处理额外的@L_874_0@输入空格.因此,它不是@L_874_0@输入的万无一失.

我决定尝试第三个测试用例(@L_874_0@包括非空白字符前后的换行符)

``
hahasjbas asasadlk


23

manbdjas sadjadja a


46

答案是

3
3

在这个测试案例中都失败了.

解决方法

前两个略有不同:它们都读取并忽略所有字符直到新行.然后第一个跳过所有连续的空格,因此在执行之后,您读取的下一个字符将是非空格.

第二个读取并忽略字符,直到它遇到一个新行然后再读取(并丢弃)一个字符.

如果您有(例如)双倍行距文本,则会显示差异,例如:

line 1

line 2

让我们假设你读到了第1行中间的某个地方.如果你执行第一个,你读入的下一个字符将是第2行的’l’.如果你执行第二个字符,你读到的下一个字符将是是第1行和第2行之间的新行.

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

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

……是的,这确实可行 – &&强制执行序列点,因此首先计算其左操作数.然后有一个序列点.然后,当且仅当左操作数计算为true时,它才会计算其右操作数.

至于性能差异:既然你正在处理I / O,那么所有这些都将永远受I / O约束的问题几乎没有.尽管其显而易见的复杂性,但scanf(和公司)通常是经过多年使用并经过多年精心优化的代码.在这种情况下,手动循环可能会慢得多(例如,如果getchar的代码没有内联扩展),或者它可能大约相同的速度.如果编写标准库的人不称职,那么唯一可能显着提高速度的方法就是它.

至于可维护性:IMO,任何声称知道C的人都应该知道scanf的扫描集转换.这既不是新的也不是火箭科学.任何不了解它的人都不是一个称职的C程序员.

大佬总结

以上是大佬教程为你收集整理的每次输入后刷新stdin – 哪种方法不是错误的?全部内容,希望文章能够帮你解决每次输入后刷新stdin – 哪种方法不是错误的?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。