C语言整数转字符串函数异常求助:输入2返回10000(输入范围[0;1000])
问题排查与修复
核心问题分析
你的函数输入2返回"10000",根源在于以下几个错误:
数位顺序完全颠倒
你把最高位(对应100的个位)存在`buffer[0]`,最低位(对应104的万位)存在buffer[4],导致数字的数位顺序完全反转。输入2时,实际是把个位的2拆成了1个1(10^0),buffer[0]被设为'1',其余高位都是'0',最终数组内容为{'1','0','0','0','0'}。缺少字符串终止符
C语言字符串必须以'\0'结尾,你的buffer数组初始化后没加这个终止符,strlen和strcpy会读取内存中随机位置的'\0',刚好输入2时buffer后恰好有'\0',所以返回了"10000"。浮点数精度风险
pow(10, count)返回浮点数,和整数比较时可能出现精度误差(比如pow(10,3)可能实际是999.9999999),导致判断逻辑出错。
修复后的代码
#include <stdio.h> #include <string.h> #include <stdlib.h> char* int_to_str(int input) { // 输入范围0-1000,最多4位(1000),加终止符共5个字符 char buffer[5]; char* output; int input_temp = input; // 从最高位(千位,10^3)开始处理,对应buffer[0] int count = 3; int start_idx = 0; // 初始化buffer为全'0',最后添加终止符 memset(buffer, '0', 4); buffer[4] = '\0'; while (count >= 0) { int divisor = 1; // 用整数循环计算10的幂,避免浮点数误差 for (int i = 0; i < count; i++) { divisor *= 10; } if (input_temp >= divisor) { buffer[3 - count] = '0' + (input_temp / divisor); input_temp %= divisor; } count--; } // 找到第一个非0字符的位置,处理前导0(除了输入0的情况) if (input != 0) { while (buffer[start_idx] == '0') { start_idx++; } } // 分配足够的内存存储结果 output = malloc(sizeof(char) * (strlen(buffer + start_idx) + 1)); if (output == NULL) { return NULL; // 处理malloc失败的情况 } strcpy(output, buffer + start_idx); return output; } // 测试示例 int main() { char* str = int_to_str(2); printf("%s\n", str); // 输出"2" free(str); str = int_to_str(234); printf("%s\n", str); // 输出"234" free(str); str = int_to_str(1000); printf("%s\n", str); // 输出"1000" free(str); str = int_to_str(0); printf("%s\n", str); // 输出"0" free(str); return 0; }
关键修复点说明
- 数位顺序修正:将千位对应
buffer[0],个位对应buffer[3],确保字符串顺序和数字高位到低位一致。 - 添加终止符:初始化时直接设置
buffer[4] = '\0',保证字符串合法。 - 替换pow函数:用整数循环计算10的幂,彻底避免浮点数精度问题。
- 处理前导0:自动跳过前导0,确保输入2返回"2"而非"0002",输入0时保留"0"。
- 增加错误处理:检查
malloc是否成功,避免空指针访问。
内容的提问来源于stack exchange,提问作者Yuki
相关产品推荐
相关产品推荐

