在吸收用键盘输入的数据时gets()与scanf()函数都有读取字符串的功能。但是他们吸收字符串除了gets()能吸收空格而scanf()不能吸收空格的区别之外。他们还是有很大的区别的。若能掌握这些细节,那么用这些函数时就能更加灵活
咱们先看课本中对gets()和scanf()吸收字符串的介绍。
gets()函数用法:
gets()函数可以接受输入包含空格的完整句子,知道遇到换行符结束。 功能:接受用户键盘输入,将输入的字符串保存在字符数组中,如果接受到【enter】键则返回,并在字符串的末尾加上字符串结束字符' ';
char str[100];
gets(str);
puts(str);
输入字符串 ''how are you''【回车】输出str字符串 结果为how are you,当然字符串结尾str[11]=' ';(回车键当然也不会吸收)
gets()函数可以吸收空格,但遇见回车不吸收,并且把把回车当作该字符串的结束标志,在字符串末尾补' ';
scanf()函数用法:
scanf()函数吸收字符串时使用格式控制符%s,与%s对应的是字符数组的名称,此时空格和回车符号均作为输入数据的分隔符而不能读入。
eg:
#include<stdio.h>
int main()
{
char s1[100],s2[100],s3[100];
scanf("%s%s%s",s1,s2,s3);
printf("s1=*%s*,s2=*%s*,s3=*%s*",s1,s2,s3);
}
输入字符串 ''how are you''【回车】输出:s1=*hello*, s2=*are*,s3=*you*;
即scanf()吸收字符串时,不吸收空白符,遇见空白符停止吸收,在字符串末尾补' ',并且scanf()吸收字符时会自动略过开头的空白符,直至遇见一个非空白符才开始它的吸收过程。
那么咱们再进一步详细的思考
相信打过一段时间的代码的人都知道,用scanf()吸收字符串时,如果scanf()后面还有一个字符变量,为了不让字符变量被被回车或者空格影响,都会在中间加个getchar();
#include<stdio.h>
int main()
{
char a,s[100];
scanf("%s",s);
getchar();
scanf("%c",&a);
printf("string s=*%s*,char a=*%c*",s,a);
}
输入:abcd e【回车】
输出:string s=*abcd*,char a=*c*;
若不加getchar();
#include<stdio.h>
int main()
{
char a,s[100];
scanf("%s",s);
scanf("%c",&a);
printf("string s=*%s*
char c=*%c*",s,a);
}
输出应该就是:string s=*abcd*,char a=* *; 可见空格被字符a吸收了。
这个测试说明:scanf()在接受字符串的时候,遇见字符串结束符号 也就是空白符,不吸收并且将之留在输入缓存缓存区内(stdin文件中),使得下一个字符在吸收时先遇见的便是空白符。所以一般情况下用getchar()把该空白符吸收了,防止对后面的字符吸收数据有影响。
那么gets()函数吸收字符串时对结束标志的处理跟scanf()一样吗? 不知道,那么就测试一下呗。
#include<stdio.h>
int main()
{
char a,s[100];
gets(s);
a=getchar();
printf("string s=*%s*,char a=*%c*",s,a);
}
输入:abcd【回车】e
输出:string s=*abcd*,a=*e*
什么 ∑( 口 || gets()竟然可以不用getchar();就把回车符号给吸收了
那么再测试一个开头就是回车的数据
输入:【回车】a
输出:string s=**,a=*a*
∑( 口 || gets()竟然也可以吸收只有一个回车的空字符串。。。。
其实gets()在吸收字符串时遇见回车就把回车从输入缓存区内吸收,并且结束吸收,把吸收的回车符号变为字符串结束标志' '
所以gets()吸收字符串时不会在输入缓存区内留下吸收过的任何东西,而且开头的空字符串gets()也会将之看作字符串吸收。
而scanf()在吸收字符串时会自动掠过开头的空白符(也就是对于他的来说的空字符串),而直至遇见一个非空白符才开始吸收, 并且遇见它的结束标志后,停止吸收字符,并且将该结束标志留在输入缓存区内。
总结:
gets()吸收字符串时,会吸收空字符串(只有一个回车的字符串),并且吸收完字符串后将回车符号吸收变为' ',不在输入缓存区内留下该回车符号。
scanf()吸收字符串时,会自动掠过开头的空白符,直至遇见第一个非空白符才开始吸收,并且吸收完字符串后,会自动在吸收的字符串后加上' '。将遇见的结束标志(空白符)还留在输入缓存区内。
每种函数都有自己特殊的用法,要将之灵活运用。
PS:puts()输出字符串时会自动加上换行。
如果该文章有错误,请在下方评论区补充,我将不胜感激。