gets()函数与scanf()函数对读取字符串的区别之处。

在吸收用键盘输入的数据时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()输出字符串时会自动加上换行。



如果该文章有错误,请在下方评论区补充,我将不胜感激。
原文地址:https://www.cnblogs.com/dchnzlh/p/9780096.html