CC++中辨识scanf()与gets()、printf()与puts();且引申出的缓冲区问题

CC++中辨识scanf()与gets()、printf()与puts();且引申出的缓冲区问题,第1张

C/C++中辨识scanf()与gets()、printf()与puts();且引申出的缓冲区问题

今天是22/1/25,寒假返乡后约莫已过俩周,放假前踌躇满志但直到今天夜里购置的书本才完全到达,以后的约30天中,我一定尽力做到每天学习五小时以上,合理的记单词及阅读《c与指针》,《c++primer plus》,后续也会根据自己的学习体会来编写博客,仅供自我督促,同时与诸君共勉,欢迎勘误,不尽感激。

由于我的学校本科阶段对c/c++要求较低,导致我连着考试等等几乎只会使用scanf()及printf()来进行输入输出,对gets/puts不求甚解,csdn上已有太多此番解析,合理借鉴,结合我心中迷惑写下本文。

    char List[10];
	scanf("%s",List);
	printf("The scanf()=%sn",List);
	gets(List);
	printf("The gets()=%s",List);

 

由本例可以清楚的看出,scanf()中格式字符为%s时,其无法接受空格与回车,将直接终止scanf()从标准输入中获取字符串,紧接着后续的 空格to空格meet空格you都传给了gets()

在这里我们着重讨论一下缓冲区,这是我在初学阶段并不了解的事物,每每输入出了问题,都只会fflush(stdin)了事。

scanf()与gets()都是标准输入流,我们通过黑框输入,数据保存进缓冲区,然后scanf()/gets()再在缓冲区中录用符合其格式的字符/字符串。

在这里着重提一下,scanf()中只有%c能接收空格,其余的都不会接收,遇到即结束该函数

	char List1[10],List2[10],List3[10],a;
	scanf("%s%c",List1,List2);
	printf("The List1=%sn",List1);
	gets(List3);
	printf("The List2=%sn",List2);
	printf("The List3=%sn",List3);
	return 0;

本段代码的结果:

思索一下这个例子,基本上就体会了缓冲区的意义,当scanf()函数出现时,哪怕他的格式符只有一个%s,它也不会因为你输入:Hello后敲击空格而结束该函数。整个数据Hello world!!全都先储存在数据缓冲区,这也说明了后续gets()函数甚至不用你输入,gets()/scanf()都是从缓冲区取得数据,缓冲区没有,才会让你输。

 同时也会引出一些经典问题:

譬如此,第一个scanf()中的第二个格式符为%c,于是它把回车键给吞了。

即使你拆开写也一样吞了。

 这才有了解决问题的方法在吞空格的代码前面添加getchar()/fflush(stdin)这类吃缓冲区的数据(前者吃一个,后者全部清空)

而printf()与puts()函数用处大同小异,基本上不会出问题,唯一区别在于:puts函数会在输出完后遇替换成n自动换行。也就不再展开叙述

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5713969.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存