求解释c语言关于scanf的问题

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 和 参数不对应,读取的当然是错误的,输出也是乱码。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7524823
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:关于scanf("%s", &a) 和 scanf("%c", &a)标准输入的不同
  • 除此之外, 这篇博客: C语言中scanf输入汇总中的 %d的几种形式总结 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 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组,那么它也会执行,而不是一直阻塞等待另外两个数
当然最终只有第一个参数被成功赋值,后面两个参数没有值