You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

指定%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按顺序完成以下操作:
    1. 最多读取2位连续数字,转换为整数赋值给变量a
    2. 匹配输入流中紧随其后的字符必须为冒号:
    3. 冒号匹配成功后,最多读取2位连续数字,转换为整数赋值给变量b
  • 输入为151:33时的执行流程:
    1. 第一步读取前两位数字15赋值给a,输入流剩余未读内容为1:33
    2. 第二步尝试匹配冒号,此时输入流下一个字符为'1',和要求的:不匹配,scanf直接终止整个读取流程,不会继续执行后续的读取逻辑
    3. 最终仅a被成功赋值,b作为栈上的局部变量未被初始化,保留了内存中的随机垃圾值,也就是你看到的32764这类异常输出
  • 你可以通过打印scanf的返回值验证:输入151:33时返回值为1,代表仅1个变量被成功赋值,符合上述逻辑。

内容的提问来源于stack exchange,提问作者Terra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 17:36:03