C语言中scanf用逗号分隔格式说明符时为何第二个变量取垃圾值?
scanf格式串含逗号导致int变量读取垃圾值的原因解析
测试代码
int main(void){ char ch; int a; scanf("%c,%d",&ch,&a); printf("%c,%d",ch,a); return 0; }
问题原因
scanf的格式串中,非格式说明符(比如这里的逗号)要求输入内容必须严格匹配。当你使用"%c,%d"作为格式串时,程序会期望你输入字符+逗号+整数的完整格式(例如C,123)。
你实际输入C后直接回车,流程是这样的:
%c成功读取字符C;- 接下来scanf会去寻找格式串里的逗号,但输入流中紧跟
C的是换行符\n,和逗号不匹配; - scanf直接终止后续读取操作,变量a完全没被赋值,它的值是栈内存中的随机垃圾数据,所以输出时会显示无意义的数字。
如果去掉格式串里的逗号,写成"%c%d":
%c读取C后,%d会自动跳过空白字符(包括换行、空格),程序会等待你输入整数,因此能正确读取a的值。
补充说明
- 若要保留格式串里的逗号,输入必须严格对应格式,比如输入
C,456再回车,就能正常读取两个变量的值; - 使用
%c时要注意,它会读取任何字符(包括空白符),如果之前的输入残留了换行符,可能会被%c意外读取,这时候可以在%c前加空格,写成" %c,%d",让scanf自动跳过前面的空白字符。
内容的提问来源于stack exchange,提问作者Suraj_Fusion
相关产品推荐
相关产品推荐

