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

在吸收用键盘输入的数据时gets()与scanf()函数都有读取字符串的功能。但是他们吸收字符串除了gets()能吸收空格而scanf()不能吸收空格的区别之外。他们还是有很大的区别的。若能掌握这些细节,那么用这些函数时就能更加灵活

咱们先看课本中对gets()和scanf()吸收字符串的介绍。

gets()函数用法:

gets()函数可以接受输入包含空格的完整句子,知道遇到换行符结束。   功能:接受用户键盘输入,将输入的字符串保存在字符数组中,如果接受到【enter】键则返回,并在字符串的末尾加上字符串结束字符'\0';

char str[100];
gets(str);
puts(str);

 

输入字符串 ''how are you''【回车】输出str字符串 结果为how are you,当然字符串结尾str[11]='\0';(回车键当然也不会吸收)

gets()函数可以吸收空格,但遇见回车不吸收,并且把把回车当作该字符串的结束标志,在字符串末尾补'\0';

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()吸收字符串时,不吸收空白符,遇见空白符停止吸收,在字符串末尾补'\0',并且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*\nchar 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()在吸收字符串时遇见回车就把回车从输入缓存区内吸收,并且结束吸收,把吸收的回车符号变为字符串结束标志'\0'

所以gets()吸收字符串时不会在输入缓存区内留下吸收过的任何东西,而且开头的空字符串gets()也会将之看作字符串吸收。

 

而scanf()在吸收字符串时会自动掠过开头的空白符(也就是对于他的来说的空字符串),而直至遇见一个非空白符才开始吸收, 并且遇见它的结束标志后,停止吸收字符,并且将该结束标志留在输入缓存区内。

 

 

 

 

总结:

gets()吸收字符串时,会吸收空字符串(只有一个回车的字符串),并且吸收完字符串后将回车符号吸收变为'\0',不在输入缓存区内留下该回车符号。

scanf()吸收字符串时,会自动掠过开头的空白符,直至遇见第一个非空白符才开始吸收,并且吸收完字符串后,会自动在吸收的字符串后加上'\0'。将遇见的结束标志(空白符)还留在输入缓存区内。  

 

 

 

每种函数都有自己特殊的用法,要将之灵活运用。

PS:puts()输出字符串时会自动加上换行。

 

 

 

如果该文章有错误,请在下方评论区补充,我将不胜感激。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值