菜货一边看书一边提问 关于Sacanf()与getchar() 过滤回车!!多则多则!!
做习题遇见一个问题 想了挺久 网文也搜过 书也看过 但是还是拿不准 特来求助
我的理解:(拿不准,大家火眼晶晶看我理解对没有 谢谢):
首先
scanf()以2种形式结束读入
1:指定了字符限制数,比如%10s 只读入10个字符
2:遇见(但不包括)下一个空白符 (\n \t 空格) //这里书本上写的但不包括
其次
getchar()
getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中(虽然不甚了解,姑且理解为1个暂时停留点).直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdio流中"每次读入一个字符".getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1(何时才能返回-1呢?),且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.
再次
getchar() 和 scanf(“%c”)的功能是一样的。
这两个函数读入的是输入流中当前位置的字符,
比如:
scanf(“%d”,&n);
c = getchar();
转入正题:
scanf("%d",&n);
getchar(); //滤去回车
类似这样2行代码
我可不可以理解为:(假设我输入一个abc回车)
scanf从a一直读取到c,遇见(但不包括)回车键,结束字符读入。
此时光标"指向"回车键,这个回车键停留在缓冲区中。
接着就是执行 getchar()
由于缓冲区里面还有个回车,所以getchar()直接读入。
思考:
没有循环的情况下,getchar()是单个字符逐个读入,从键盘也好,从缓冲区也罢。一个字符消耗一个getchar() (这样理解有问题吗?)
至于scanf,当它遇见空白符便停止,并不对其做任何处理。并不像gets()那样读入后,生成结束符,而后丢弃换行符,
衷心的希望能指点小弟1下,这里有点悬。虽说以前也迷迷糊糊的用过几次,但是未能完全理解。望指点。。多则多则!
[解决办法]
你自己不是说了么,当你输入一个数据的时候,回车符停留在了缓冲区,然后使用getchar读取缓冲区的回车符。