c - itoa 递归地

标签 c recursion itoa

我一直在尝试编写一个递归版本的函数itoa,代码如下所示。

void itoa(int n, char s[])
{
     static int i = 0;

     if(n / 10 != 0)
         itoa(n/10, s);
     else if(n < 0)
         i = 1; /* s[0] is allready taken by - sign */
     else 
         i = 0; /* reset i to 0 */

     if(n < 0) {
          s[0] = '-';
     }

     s[i++] = abs(n % 10) + '0';
     s[i] = '\0';
}

但是代码并不理想。它使用了一个 static 变量,并且执行速度可能没有达到应有的速度。我正在尝试实现一个O(n) 算法。谁能告诉我更好的方法?我也认为静态变量不是必需的,但我不太确定如何避免它。我是否应该将函数分成两部分以避免静态变量?

最佳答案

如果你想递归地解决它,一个更简单的方法可能是返回最后一个索引:

int itoa(int n, char s[])
{
    int i =  0;         

    if(n / 10 != 0)
        i = itoa(n/10, s);
    else if(n < 0)
        s[i++] = '-';

    s[i++] = abs(n % 10) + '0';
    s[i] = '\0';

    return i;
}

你也可以用指针解决它:

char * itoa(int n, char * s)
{
    char * dest = s;

    if(n / 10 != 0)
        dest = itoa(n/10, dest);
    else if(n < 0)
        *dest++ = '-';

    *dest++ = abs(n % 10) + '0';
    *dest = '\0';

    return dest;
}

但是需要注意的是,此实现很容易出现缓冲区溢出。您需要确定您已经分配了一个足够大的缓冲区来容纳整数的整个 ascii 表示。一个好主意是包括一些边界检查。

关于c - itoa 递归地,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1993571/

相关文章:

C - 用低位宏显示字符串

recursion - Arangodb AQL递归图遍历

在C中创建字符串

c++ - 用 itoa 打印 BCD 值

C : How do you simulate an 'exception' ?

c - 检测 scanf 何时没有输入

c++ - 传递引用阻碍 gcc 消除尾调用

javascript - 如何调用异步递归函数?

c - itoa 使用反向(字符串)代码显示错误

计算两个数的位数并比较 [C]