c语言如何清空编程栏,编程达人

这篇博客探讨了在C语言编程中如何有效地清除输入缓冲区的问题。作者通过示例代码展示了在使用scanf函数后,由于缓冲区残留字符导致的错误情况,并提出了两种解决方案:一是使用setbuf函数将stdin设置为无缓冲区;二是利用getchar函数循环读取直至缓冲区为空。文章警告了使用fflush(stdin)的不稳定性,因为它不是标准C语言的一部分,且在不同编译器下行为可能不同,因此建议避免使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include //标准输入输出头文件

#include

#include

#define SIZE 10

/*程序开始*/

int main(void)

{

char s[SIZE] = {0};

int c;

do

{

printf("输入小于9位数字金额[例如:99.87]:");

scanf_s("%s", s, SIZE);

//fflush(stdin); //清空键盘缓冲区失败,非标准库函数,VS2017不支持

while ((c = getchar()) != EOF&& c != '\n');//清空键盘缓冲区成功

if (strlen(s) == 0) //恢复初始值

{

for(int i = 0;i < SIZE;i++)

s[i] = 0;

}

} while (strlen(s) ==0);//如果长度为0或大于SIZE,重新输入

printf("%.2f\n",atof(s));

}

参考资料:

#include

int main()

{

int num;

char ch ;

scanf("%d",&num);

scanf("%c",&ch);

printf("helloworld\n");

system("pause");

return 0;

}

设想输入一个数字和一个字母,应该出现如下情况

1

a

hello world

但事实是下面的样子

1

hello world

-----------------------------

原因是:在输入回车(‘\n’)时,相当于输入了一个字符,这样缓冲区内就残留了一个‘\n’

再有就是我们使用scanf("%c", &ch);在中断接受一个字符,但若用户输入好几个字符,那么ch将只接受一个,而这时大量字符滞留在缓冲区内,下次再调用scanf时,还没有输入东西,缓冲区内的内容直接传到了scanf内,这样就造成了严重的错误。

下面是几种解决办法:

①解决办法一

#include

int main()

{

int num;

char ch ;

scanf("%d",&num);

setbuf(stdin, NULL);//使stdin输入流由默认缓冲区转为无缓冲区

scanf("%c",&ch);

printf("helloworld\n");

system("pause");

return 0;

}

使用setbuf(stdin,null);可以使stdin输入流由默认缓冲区转为无缓冲区,这样scanf输入完毕后,缓冲区内的东西就消失了。

#include

int main()

{

int num;

char ch ;

scanf("%d",&num);

while ((c = getchar()) != EOF && c !='\n');//不停地使用getchar()获取缓冲中字符,直到获取的c是“\n”或文件结尾符EOF为止

scanf("%c",&ch);

printf("hello world\n");

system("pause");

return 0;

}

使用getchar不断获取缓冲区内的内容,直到缓冲区内空为止,这种方法很有效,建议使用,C primer 上也介绍了这种方法。

注意:有很多人可能觉得使用fflush(stdin);不就能清空缓冲区了,但使用这种方法有很多不确定性。

网上查了原因:C和C++的标准里从来没有定义过 fflush(stdin)。

某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,

但是并非所有编译器都要支持这个功能(linux 下的 gcc 就不支持),//亲测确实如此在linux的gcc下不能清空缓冲区

因为标准中根本没有定义 fflush(stdin)。

MSDN 文档里 也清楚地写着fflush on input stream is an extension to the C standard(fflush 操作输入流是对C标准的扩充)。

当然,如果你毫不在乎程序的移植性,用 fflush(stdin) 也没什么大问题。

所以大家最好不要使用fflush,移植性不好,反正上面的方法也不烦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值