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

C语言整数转字符串函数异常求助:输入2返回10000(输入范围[0;1000])

问题排查与修复

核心问题分析

你的函数输入2返回"10000",根源在于以下几个错误:

  1. 数位顺序完全颠倒
    你把最高位(对应100的个位)存在`buffer[0]`,最低位(对应104的万位)存在buffer[4],导致数字的数位顺序完全反转。输入2时,实际是把个位的2拆成了1个1(10^0),buffer[0]被设为'1',其余高位都是'0',最终数组内容为{'1','0','0','0','0'}。

  2. 缺少字符串终止符
    C语言字符串必须以'\0'结尾,你的buffer数组初始化后没加这个终止符,strlen和strcpy会读取内存中随机位置的'\0',刚好输入2时buffer后恰好有'\0',所以返回了"10000"。

  3. 浮点数精度风险
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 22:29:56