char a;
int b;
scanf("%d",&b);
scanf("%c",&a);
用户输入了 #回车
a输出了# 而b是乱数据
为什么前面的%d没有读取到东西不会卡住而是进行下一步读取%c
如果改成scanf("%d%c",&a,&b);输入#回车
结果发现,a和b都输出乱数据
用户输入了 #回车。scanf("%d", &b); 因为 # 是字符,用%d读取出错,所以这句scanf()读取不成功,#回车 仍然保留在输入缓冲区里。然后执行scanf("%c", &a); ,这句格式符是 %c ,所以将缓冲区里 # 读取后存入字符变量 a里,此时 回车符 仍然残留在缓冲区里,所以输出 b 是乱码,a 输出了 #。
为什么前面的%d没有读取到东西不会卡住,参考scanf()函数详细用法:https://baike.baidu.com/item/scanf/10773316?fr=ge_ala
如果改成scanf("%d%c",&a,&b);输入#回车,格式符%d%c 和 参数不对应,读取的当然是错误的,输出也是乱码。
1、%d就是普通的输出了
2、%2d是将数字按宽度为2,采用右对齐方式输出,若数据位数不到2位,则左边补空格.%-2d是将数字按宽度为2,采用左对齐方式输出。
3、%02d,和% 2d差不多,只不过左边补0
修饰符 格式说明 意义:1、M
%md 以宽度m输出整型数,不足m时,左补空格
2、0m
%0md 以宽度m输出整型数,不足m时,左补零
3、m,n
%m.nf 以宽度m输出实型小数,小数位为n位
你把你代码贴出来
scanf本来就没有卡住的功能
如果输入缓冲区里面是空的,scanf会阻塞等待输入
而只要输入缓冲区里有内容,scanf就一定能执行并返回结果
当然执行结果并不一定是变量被赋值
scanf有返回值,代表到底有几个变量被正确赋值,如果返回值小于等于0,就表明有错误
因为b没有初值,所以会是随机数(因为会随机分配内存,内存里有残留值)
因为%d在赋值失败时不会从缓冲区里将数据读走,所以#还在缓冲区里,不影响a的取值
-=-=-=
同样的,如果你的scanf里写了3个变量,而实际输入只有1组,那么它也会执行,而不是一直阻塞等待另外两个数
当然最终只有第一个参数被成功赋值,后面两个参数没有值