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

C语言scanf不同格式符读取数组整数时转换结果异常问题

问题根因

代码输出不符合预期,本质是对C语言标准IO的整数格式符逻辑理解有偏差,具体有两个问题:

  1. scanf的格式符定义的是输入字符串的解析规则,不是数值转换规则
    整数在内存中统一以二进制形式存储,scanf拿到输入的字符流后,会按照你指定的格式符规则把字符串解析成二进制整数存入内存,不存在“存成八进制数”“存成十六进制数”的区别:
  • %d:按十进制解析输入串,输入437得到整数值437
  • %i:自动识别进制,无前导标识的输入按十进制解析,输入437得到整数值437
  • %o:强制按八进制解析输入串,合法字符为0-7。你输入437时,程序会将其识别为八进制数0437,换算为十进制是4*64 + 3*8 +7 = 287,这就是第三个输出值为287的来源。如果要通过%o读到整数值437,需要输入437对应的八进制表示665
  • %u:按无符号十进制解析输入串,输入437得到整数值437
  • %x:强制按十六进制解析输入串,输入437时,程序会将其识别为十六进制数0x437,换算为十进制是4*256 +3*16 +7 =1079,这就是第五个输出值为1079的来源。如果要通过%x读到整数值437,需要输入437对应的十六进制表示1b5
  1. printf格式符和输出需求不匹配
    printf的格式符定义的是内存中二进制整数转输出字符串的规则,你全程用%d只会输出十进制数字,不可能输出十六进制包含的字母b,自然得不到1b5的结果。要输出八进制字符串需要用%o,输出十六进制字符串需要用%x。
修正后代码
#include <stdio.h>
#include <stdlib.h>

#define LENGTH 5

int main()
{
    int array[LENGTH];

    printf("Enter values in order: decimal 437, auto-detected 437, octal 437, unsigned decimal 437, hexadecimal 437: ");
    scanf("%d", &array[0]);
    scanf("%i", &array[1]);
    scanf("%o", &array[2]);
    scanf("%u", &array[3]);
    scanf("%x", &array[4]); 

    printf("\nResult:\n");
    printf("%d", array[0]);
    printf(" %d", array[1]);
    printf(" %o", array[2]);
    printf(" %d", array[3]);
    printf(" %x", array[4]);
    printf("\n");

    return 0;
}

运行程序后按顺序输入437 437 665 437 1b5,即可得到预期输出437 437 665 437 1b5。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 20:31:03