本人只是一个普普通通的双飞大学生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;
}