C语言十进制转十六进制取低四位:返回字符串与函数内不符排查
问题分析与解决方案
咱们先拆解你代码里的几个核心问题,就能明白为什么主函数拿不到正确结果,还会出现x1≠x2的情况:
1. 局部指针修改不影响原数组地址
你在函数里对x执行x++操作时,修改的只是函数内部的指针副本,主函数里传入的原数组指针根本没变化。举个例子:主函数里的x指向数组首地址0x1000,函数里的x是这个地址的拷贝,你把函数里的x移到0x1004,主函数的x还是指向0x1000,所以主函数看到的永远是sprintf最初写入的完整字符串。
2. 多余的换行符打乱长度判断
你用了sprintf(x, "%04X\n", num),这里的\n会在字符串末尾多占一个字符。比如原本四位十六进制字符串长度是4,加了换行后变成5,直接触发size>4的判断逻辑,导致指针被错误移动。
3. 字符串截断逻辑完全错误
就算指针问题解决了,你现在的逻辑是从字符串开头往后截断到4位,但我们需要的是低四位十六进制数字(也就是数值的低16位),比如0x12345678的低四位是5678,而不是前四位1234。靠移动指针截断字符串的方式,完全搞反了截取方向。
修正后的代码
正确的思路应该是先把数值的低16位(对应四位十六进制)掩码出来,再直接格式化输出,根本不需要处理字符串截断:
#include <stdio.h> #include <string.h> char* dec_to_hex_converter(int num, char x[]) { // 用掩码取出低16位,确保只保留四位十六进制对应的数值 int low_16bits = num & 0xFFFF; // 格式化输出为4位大写十六进制,自动补前导0,不要加换行符 sprintf(x, "%04X", low_16bits); // 返回原数组指针,和主函数传入的地址一致 return x; } // 主函数调用示例 int main() { char hex_buf[10]; int test_nums[] = {0x1234, 0x12345678, 0xABC, 0xFFFF}; for (int i = 0; i < 4; i++) { dec_to_hex_converter(test_nums[i], hex_buf); printf("0x%X → %s\n", test_nums[i], hex_buf); } return 0; }
运行结果:
0x1234 → 1234 0x12345678 → 5678 0xABC → 0ABC 0xFFFF → FFFF
为什么之前会出现x1≠x2?
主函数里的x1是你传入的数组首地址,而函数返回的x是被你移动后的指针(比如原数组首地址+5),这两个指针指向数组的不同位置,自然不相等。修正后我们返回原数组指针,就能保证主函数拿到的地址和函数返回值一致。
内容的提问来源于stack exchange,提问作者shaked
相关产品推荐
相关产品推荐

