在学习C语言时,我们经常要使用Char 和 Char[] 来存储字符和字符串。然而,在读取数据时,scanf、get和gets对缓存区的操作和读取结果会影响我们数据输入的结果。这次博客主要解释空格和回车对不同读取函数的影响。
写在前面:
- 只有在调用读取类函数且缓存区空了的情况下,才会让用户输入。换言之,即使读取和输出类函数交错调用,只要用户第一次输入的数据足够"多",那么这个程序将自动按照顺序执行各个函数。但是用户的视角来看,会出现全体输入类函数先执行,然后再执行输出类函数的错觉。
- 各个读取类函数的结束判断标志和允许读入的数据可能会有不同,这将导致一些差异。
- 若只考虑用户使用回车键换行,则缓存区至多只有一个换行且在末尾。
- 敲击回车的两个意义:1.在缓冲区末尾添加一个换行符(\n,ASCII码10)2.用户结束本次输入操作,程序继续执行,直到下一次缓存区为空。
- 敲击空格的意义:在缓冲区添加一个空格符(ASCII码13)
对字符的输入
getchar 和 scanf("%c",char*)
使用格式:
char c;
c=getchar();
scanf("%c",&c);
除了使用格式不同以外,在读取方面基本一致。
判断结束的标志:换行
要点:1.会将换行和空格读走;
2.在执行时时,如果缓存区有字符存在,则直接读入,哪怕是换行符;
3.如果直接调用getchar()但不进行赋值,可以从缓存区中取出一个字符,但是只能”抛弃“。(这个后面有用)
总结:两位不挑食,拿了就走;如果缓存区空了,就请用户输入一些,然后依然是拿了就走。
-
对字符串的输入
gets(char*)和scanf(”%s“,char*)
使用格式
char s[n];//n需要为正整数数
scanf(”%s“,s);
gets(s);
判断结束的标志:
gets():以换行为结束标志,空格也会被读进来。
scanf():以换行和空格为结束标志,空格不会被读进来。
两者都不会读换行。
要点:
- 两者都不会将换行读入,且对缓存区操作有区别。
- scanf若遇到空格或换行,则会结束本次读取。如果未能读到字符串,则会将这个空格或换行剔出缓存区,并进行下一次尝试,直到读到字符串。
- scanf在用于其他类型的数据时,表现也会类似第二条。
- scanf读到字符串(数据),遇到换行或空格后就结束,不会将其剔出,这个会干扰后面调用的字符读取和gets()。
- gets()如果遇到换行就会停止,并将这个换行给剔出,且不在尝试读取字符串。
- 如果之前使用过scanf()进行各种类型的数据读取,如果要避免残留的空格和换行符对gets()和字符读取的干扰,可以考虑调用一次gets()清空缓存区,如果对用户的输入方式放心的话,可以调用getchar()。
记忆:scanf会一直坚持直到到拿到字符串,在那之前的空格和换行会被剔出,拿到后就不再剔出空格和换行。
gets只会拿一次,且接受空格。遇到换行符时会把它剔出,即使未能取到字符串,也会将遇到的换行符剔出并结束。