C语言中将1-99十进制数转十六进制并存入数组的问题
问题分析与解决
嘿,我来帮你揪出代码里的问题根源!你看到的异常值,完全是因为用错了字符串转数值的函数导致的,和空终止符关系不大哦~
为什么会出现异常?
你的核心问题出在atoi(dump_holder)这一步:
atoi是专门用来解析十进制数字字符串的,它遇到非0-9的字符就会立刻停止解析,只返回之前读到的数字。- 比如当i=10时,
sprintf生成的是"0a",atoi读到'0'后碰到'a'就停了,直接返回0,所以你看到输出00; - 当i=26时,生成的是
"1a",atoi读到'1'后遇到'a'就停,返回1,于是输出01。这就是那些异常值的由来!
- 比如当i=10时,
两种正确的解决思路
根据你的需求,我给你两种方案:
方案一:直接存储数值(推荐,最简洁)
其实你完全没必要把十进制数转成字符串再转回来——数值在内存里的存储和进制无关,十六进制只是显示方式而已。你可以直接把i的数值存到数组里,输出的时候用%02x格式控制符就能以两位十六进制显示:
#include <stdio.h> int main(){ int i = 1; // 用int数组存数值,若只需要8位范围(0-255),用unsigned char更节省空间 int hex_holder[100]; for (i = 1; i < 100; i++){ hex_holder[i] = i; // 直接存原数值就好 printf("this: %02x\n", hex_holder[i]); } return 0; }
方案二:存储十六进制字符串(如果确实需要字符串形式)
如果你是想把十六进制的字符串形式保存下来,那得用二维字符数组,因为每个十六进制数需要2个字符加一个字符串终止符'\0':
#include <stdio.h> int main(){ int i = 1; // 二维数组,每个元素能存3个字符(两位十六进制+结束符) char hex_holder[100][3]; for (i = 1; i < 100; i++){ sprintf(hex_holder[i], "%02x", i); printf("this: %s\n", hex_holder[i]); // 直接输出字符串 // 如果之后需要把字符串转回数值,用strtol(支持十六进制解析): // int val = strtol(hex_holder[i], NULL, 16); // printf("对应的十进制值: %d\n", val); } return 0; }
额外小提示
如果一定要从十六进制字符串转数值,别用atoi,改用strtol并指定第三个参数为16,这样就能正确解析包含a-f的十六进制字符串了,比如:
int val = strtol(dump_holder, NULL, 16);
内容的提问来源于stack exchange,提问作者Enzo Vidal
相关产品推荐
相关产品推荐

