关于scanf()函数使用技巧(一)

本人只是一个普普通通的双飞大学生qwq,写这篇博客也只是为了记录下自己一个下午的努力qwq而且帮和我现在一样重修《C Primer Plus》的小白们分享一下我的一些见解,避免在学习scanf()函数的时候一些例题难以看懂,接下来就是我的笔记了qwq:希望有错误大佬能帮忙指出qwq:

//原理:用“ ”空格消除上一个scanf()语句中缓冲区输入数据以后最后的类似回车这类格式化字符,
//      在scanf()语句中的转换说明前使用一个“ ”有诸多好处,总结就是:

//      加入一个空格字符,以消耗掉上一个scanf()语句中输入缓冲区中的换行符或空格字符。
//      且在使用scanf()时先加入一个“ ”空格可以给此段scanf()语句下以下一个命令:
//      “对于 scanf 函数,空格字符(空白字符)在格式字符串中的作用是用来跳过输入缓冲区中的空白字符,
//      包括换行符、空格、制表符等。在格式字符串中,空格字符表示“跳过任意数量的空白字符,
//      直到遇到第一个非空白字符为止” ”
//      其实总结就一句话:使用了“ ”空格以后,该段scanf()语句会从第一个非格式化字符开始读取并赋值.      --原理1 
//      且这条原理对于同一句scanf()语句读取多条转换说明也同样适用,直接在每个转换说明之间打“ ”空格即可 --原理2 
//      还需要记住一点,在使用完scanf()语句后最后一个转换说明后一定不能输入其他格式化字符
//      必须直接跟上" ”"反引号,否则缓冲区需要额外输出一次字符以后才能结束scanf()语句并且会出现赋值错误的情况
//                    ↑即 必须为此格式:scanf(" %f , %f ,%f") ; 不能是scanf( "%f , %f , %f  " ) ;这种   --原理3 

//总述:无论何时何地,只要在使用过scanf()语句以后,无论间隔多远
//      在接下来使用的所有scanf()语句中都先打一个“ ”空格以后再继续编码
//      并且在所有一个scanf()语句中多个转化说明之间都要使用空格,原理相同,即为原理2。 

/* eg:
      scanf("%d" , a ) ;
      scanf( "%d" "%s" "%lld" "%uld" , b , c , d , e );
            ↓   ↓   ↓     ↓                             
            ↓   →→→→↓←←                 
       此处对应原理1     ↓     
       !                ↓
            此  处  对  应  原  理  2  
*/
//重点品会情景二. 
#include <stdio.h>

//注意用的都是%c,请一定要输入单个字符,否则无法发现此bug细节.
//至于对于%s,这两串代码执行并无任何区别. 
//例如都输入:“1" , ‘回车’ , “2” 


main() 
{
    printf("情景一:\n") ;
    
    char ch1, ch2;

    printf("Enter two characters(This is char , pls enter one char): \n");
    scanf("%c", &ch1);
    scanf("%c", &ch2);

    printf("ch1 = %c, ch2 = %c\n", ch1, ch2);

    printf("输入一次回车进入情景一正确代码模式。\n") ;
    getchar() ;

//当你运行这个代码并输入两个字符后,你会发现第二个 scanf("%c", &ch2) 并没有等待你输入第二个字符,
//而是直接读取了1个换行符或空格字符。
//这是因为前一个 scanf 函数在读取字符后,留下了换行符或空格字符在输入缓冲区中。
//为了解决这个问题,你可以在第二个 scanf 函数前加入一个空格字符,以消耗掉前一个输入留下的换行符或空格字符,
//正确代码:

//#include <stdio.h>

    printf("情景一正确代码:\n") ; 
    char ch3, ch4;

    printf("Enter two characters(This is char , pls enter one char): \n");
    scanf("%c", &ch3);
    scanf(" %c", &ch4);       //--因为在"%c"之前加入了“ ”空格,所以过滤掉了上面一句scanf()交互后遗留的格式化字符回车符 
    //--除此之外还有另一种方式,就是在两个连续的scanf()之间添加一个getchar()函数
    //--但是这样远没有加“ ”空格的方式来的简单粗暴
    //而且最重要的一个点是此种加getchar函数消除缓冲区的格式字符无法用于scanf()函数中读取多个转换说明数据情况 

    printf("ch1 = %c, ch2 = %c\n", ch3, ch4);
    
    printf("\n\n\n") ;

    printf("输入三次回车进入情景二。\n") ; 
    getchar() ;    //--这个得到的是    scanf(" %c", &ch4);这个函数交互后的回车符 
    getchar() ;
    getchar() ; 
    getchar() ;
    
    printf("情景二:\n") ; 
    int a ;
    char b , pet[30] ;
    
    printf("input not string : \n") ;
    scanf("%d" , &a ) ;
    printf("a = %d \n" , a ) ; 
    
    printf("input is char and string : \n") ; 
    scanf("%c %s" , &b , pet ) ;        
    printf("char = %c ,string = %s\n" , b , pet ) ;
    
    printf("输入一次回车进入情景二正确模式。\n") ; 
    getchar() ;
    getchar() ;
    
    printf("情景二正确代码:\n") ; 
    
    int c ;
    char d , pet1[30] ;
    
    printf("input not string : \n") ;
    scanf("%d" , &c ) ;
    printf("a = %d \n" , c ) ; 
    
    printf("input is char and string : \n") ; 
    scanf(" %c  %s" , &d , pet1 ) ; 
    //   --用scnaf()语句获取string后用不用“&”来传递给变量都可以
    //   --意思也就是 : scanf( "%s" , pet1 ) ; 和 scanf("%s" , &pet1 ) ;
    //   --这两种皆可.           
                                           
    printf("char = %c ,string = %s\n" , d , pet1 ) ;
    
    printf("\n\n\n") ;
    
    printf("程序执行完毕,请仔细观察 , 请仔细观察 ,请仔细观察 。") ; 
    
    return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值