指定%2d:%2d输入格式时scanf读取数字异常是什么原因?
#include <stdio.h> int main() { int a, b; printf("Enter 2 numbers:"); scanf("%2d:%2d", &a, &b); printf("\n\n %d:%d", a, b); }
异常原因说明
- 核心是
scanf的严格顺序匹配规则和未初始化局部变量的特性共同导致的异常。 - 格式化字符串
"%2d:%2d"要求scanf按顺序完成以下操作:- 最多读取2位连续数字,转换为整数赋值给变量
a - 匹配输入流中紧随其后的字符必须为冒号
: - 冒号匹配成功后,最多读取2位连续数字,转换为整数赋值给变量
b
- 最多读取2位连续数字,转换为整数赋值给变量
- 输入为
151:33时的执行流程:- 第一步读取前两位数字
15赋值给a,输入流剩余未读内容为1:33 - 第二步尝试匹配冒号,此时输入流下一个字符为
'1',和要求的:不匹配,scanf直接终止整个读取流程,不会继续执行后续的读取逻辑 - 最终仅
a被成功赋值,b作为栈上的局部变量未被初始化,保留了内存中的随机垃圾值,也就是你看到的32764这类异常输出
- 第一步读取前两位数字
- 你可以通过打印
scanf的返回值验证:输入151:33时返回值为1,代表仅1个变量被成功赋值,符合上述逻辑。
内容的提问来源于stack exchange,提问作者Terra
相关产品推荐
相关产品推荐

