• 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()输出字符串时会自动加上换行。



    如果该文章有错误,请在下方评论区补充,我将不胜感激。
  • 相关阅读:
    洛谷 P1231 教辅的组成
    BZOJ 2190: [SDOI2008]仪仗队
    Codeforces GYM 100741A . Queries
    COGS 1298. 通讯问题
    洛谷 P2604 [ZJOI2010]网络扩容
    codevs 1227 方格取数 2
    codevs 1004 四子连棋
    洛谷 P2319 [HNOI2006]超级英雄
    洛谷 P2153 [SDOI2009]晨跑
    插入排序
  • 原文地址:https://www.cnblogs.com/dchnzlh/p/9780096.html
Copyright © 2020-2023  润新知