C语言scanf不同格式符读取数组整数时转换结果异常问题
问题根因
代码输出不符合预期,本质是对C语言标准IO的整数格式符逻辑理解有偏差,具体有两个问题:
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
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
相关产品推荐
相关产品推荐

