1

这是学校的一项任务,我应该编写一个递归函数,将给定的 int 转换为字符串,我知道我很接近但我不能指出我的代码中缺少的东西,欢迎提供提示。

void intToStr(unsigned int num, char s[])
{
    if (num < 10)
    {   
        s[0] = '0' + num;
    }

    else
    {
        intToStr(num/10, s);
        s[strlen(s)] = '0' + num%10;
    }
}

编辑:我的问题是该函数仅适用于预先初始化的数组,但如果我让该函数在未初始化的函数上工作,它将无法工作。

4

2 回答 2

3

除非您的数组是零初始化的,否则您在修改它时会忘记附加一个空终止符。

只需在最后一个字符之后添加它:

void intToStr(unsigned int num, char s[])
{
    if (num < 10)
    {   
        s[0] = '0' + num;
        s[1] = 0;
    }

    else
    {
        intToStr(num/10, s);
        s[strlen(s)+1] = 0; //you have to do this operation here, before you overwrite the null terminator
        s[strlen(s)] = '0' + num%10;
    }
}

此外,您的函数假设 s 有足够的空间来容纳所有数字,因此您最好确保它确实如此(我认为 INT_MAX 的长度为 10 位,因此您至少需要 11 个字符)。

于 2012-12-22T00:04:17.700 回答
0

Andrei Tita 已经向您展示了您在使用 NULL 终止符时遇到的问题。我将向您展示一种替代方法,以便您可以比较和对比不同的方法:

int intToStr(unsigned int num, char *s)
{   
    // We use this index to keep track of where, in the buffer, we
    // need to output the current character. By default, we write
    // at the first character.
    int idx = 0;

    // If the number we're printing is larger than 10 we recurse
    // and use the returned index when we continue.
    if(num > 9)
        idx = intToStr(num / 10, s);

    // Write our digit at the right position, and increment the
    // position by one. 
    s[idx++] = '0' + (num %10);

    // Write a terminating NULL character at the current position
    // to ensure the string is always NULL-terminated.
    s[idx] = 0;

    // And return the current position in the string to whomever
    // called us.
    return idx;
}

您会注意到,我的替代方案还返回了它输出到缓冲区的字符串的最终长度。

祝你的课程工作顺利!

于 2012-12-22T00:34:07.343 回答