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

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

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

gets()函数用法:

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


    
    
  1. char str[ 100];
  2. gets(str);
  3. puts(str);

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

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

scanf()函数用法:

scanf()函数吸收字符串时使用格式控制符%s,与%s对应的是字符数组的名称,此时空格和回车符号均作为输入数据的分隔符而不能读入。

eg:


    
    
  1. #include<stdio.h>
  2. int main()
  3. {
  4. char s1[ 100],s2[ 100],s3[ 100];
  5. scanf( "%s%s%s",s1,s2,s3);
  6. printf( "s1=*%s*,s2=*%s*,s3=*%s*",s1,s2,s3);
  7. }


输入字符串 ”how are you”【回车】输出:s1=*hello*,  s2=*are*,s3=*you*;

即scanf()吸收字符串时,不吸收空白符,遇见空白符停止吸收,在字符串末尾补’\0’,并且scanf()吸收字符时会自动略过开头的空白符,直至遇见一个非空白符才开始它的吸收过程。


那么咱们再进一步详细的思考
相信打过一段时间的代码的人都知道,用scanf()吸收字符串时,如果scanf()后面还有一个字符变量,为了不让字符变量被被回车或者空格影响,都会在中间加个getchar();

     
     
  1. #include<stdio.h>
  2. int main()
  3. {
  4. char a,s[ 100];
  5. scanf( “%s”,s);
  6. getchar();
  7. scanf( “%c”,&a);
  8. printf( “string s=*%s*,char a=*%c*”,s,a);
  9. }

输入:abcd e【回车】
输出:string s=*abcd*,char a=*c*; 
若不加getchar();

     
     
  1. #include<stdio.h>
  2. int main()
  3. {
  4. char a,s[ 100];
  5. scanf( “%s”,s);
  6. scanf( “%c”,&a);
  7. printf( “string s=*%s*\nchar c=*%c*”,s,a);
  8. }

输出应该就是:string s=*abcd*,char a=* *;                      可见空格被字符a吸收了。 
这个测试说明:scanf()在接受字符串的时候,遇见字符串结束符号 也就是空白符,不吸收并且将之留在输入缓存缓存区内(stdin文件中),使得下一个字符在吸收时先遇见的便是空白符。所以一般情况下用getchar()把该空白符吸收了,防止对后面的字符吸收数据有影响。

那么gets()函数吸收字符串时对结束标志的处理跟scanf()一样吗?   不知道,那么就测试一下呗。

    
    
  1. #include<stdio.h>
  2. int main()
  3. {
  4. char a,s[ 100];
  5. gets(s);
  6. a=getchar();
  7. printf( "string s=*%s*,char a=*%c*",s,a);
  8. }
输入: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()输出字符串时会自动加上换行。



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

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

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

gets()函数用法:

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


  
  
  1. char str[ 100];
  2. gets(str);
  3. puts(str);

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

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

scanf()函数用法:

scanf()函数吸收字符串时使用格式控制符%s,与%s对应的是字符数组的名称,此时空格和回车符号均作为输入数据的分隔符而不能读入。

eg:


  
  
  1. #include<stdio.h>
  2. int main()
  3. {
  4. char s1[ 100],s2[ 100],s3[ 100];
  5. scanf( "%s%s%s",s1,s2,s3);
  6. printf( "s1=*%s*,s2=*%s*,s3=*%s*",s1,s2,s3);
  7. }


输入字符串 ”how are you”【回车】输出:s1=*hello*,  s2=*are*,s3=*you*;

即scanf()吸收字符串时,不吸收空白符,遇见空白符停止吸收,在字符串末尾补’\0’,并且scanf()吸收字符时会自动略过开头的空白符,直至遇见一个非空白符才开始它的吸收过程。


那么咱们再进一步详细的思考
相信打过一段时间的代码的人都知道,用scanf()吸收字符串时,如果scanf()后面还有一个字符变量,为了不让字符变量被被回车或者空格影响,都会在中间加个getchar();

   
   
  1. #include<stdio.h>
  2. int main()
  3. {
  4. char a,s[ 100];
  5. scanf( “%s”,s);
  6. getchar();
  7. scanf( “%c”,&a);
  8. printf( “string s=*%s*,char a=*%c*”,s,a);
  9. }

输入:abcd e【回车】
输出:string s=*abcd*,char a=*c*; 
若不加getchar();

   
   
  1. #include<stdio.h>
  2. int main()
  3. {
  4. char a,s[ 100];
  5. scanf( “%s”,s);
  6. scanf( “%c”,&a);
  7. printf( “string s=*%s*\nchar c=*%c*”,s,a);
  8. }

输出应该就是:string s=*abcd*,char a=* *;                      可见空格被字符a吸收了。 
这个测试说明:scanf()在接受字符串的时候,遇见字符串结束符号 也就是空白符,不吸收并且将之留在输入缓存缓存区内(stdin文件中),使得下一个字符在吸收时先遇见的便是空白符。所以一般情况下用getchar()把该空白符吸收了,防止对后面的字符吸收数据有影响。

那么gets()函数吸收字符串时对结束标志的处理跟scanf()一样吗?   不知道,那么就测试一下呗。

  
  
  1. #include<stdio.h>
  2. int main()
  3. {
  4. char a,s[ 100];
  5. gets(s);
  6. a=getchar();
  7. printf( "string s=*%s*,char a=*%c*",s,a);
  8. }
输入: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()输出字符串时会自动加上换行。



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

猜你喜欢

转载自blog.csdn.net/rakish_wind/article/details/81433679