1.getsc( )函数将接收整个字符串直到回车为止。
2.scanf()函数相比gets()函数输入字符串存在一个问题,那就是输了空格之后会认为输入字符串结束,空格后字符将作为下一个输入项处理。
当然了,对于scanf也可以处理这问题。可以加入%【】,【】内可以加^任意字符(eof)来结束
字符串的输入如%【^eof】就是直到有eof输入才表示输入字符串终止。
3对于scanf的缓冲区问题
3-1 问题产生的原因:
对于函数体内连续执行两次scanf函数:
例如scanf("%c",&c);
scanf("%c",&b);
输入时我们输入字符’a’,'a’被c读取,之后回车结束,但是问题就来了,回车会转变成‘\n’符留在缓冲区内,下一句scanf函数读取字符时,即便你输入了新的字符,先读取的还是缓冲区内的‘\n’。
这是因为一般情况下,如果你使用从输入流缓冲区中读取数据的函数(scanf或者getchar),系统就会把从键盘输入的字符优先放入缓冲队列(注意,别误会,不管有没有使用从输入流读取数据的函数,系统都会把数据先输入到缓冲区,这里只是为了强调不是直接从stdin键盘缓冲区读取),直到键入回车键或者是遇到文件结束符EOF时,再从输入缓冲区逐个读取字符。
正因为如此下一句输入的字符放入输入流缓冲区(缓冲队列),这个字符前还有上一次的‘\n’,对于队列这种结构,特点是先进先出,那么
输入结束从从输入缓冲区读取字符读取的自然就是‘\n’,输入的数据则还是放在缓冲区中,以便下一次读取。
注意对于getchar也有上述问题(两个getchar连用)
3-2问题解决:
1.方法一:
scanf与getchar搭配使用
例如:scanf("%c",&a);
getchar();
2.方法二:
刷新缓冲队列:
fflush(stdin);
//这种方法在LINUX下无效,window下有效的。
scanf与gets的区分
最新推荐文章于 2023-10-31 11:01:07 发布