在C中编写一个递归函数,将数字转换为字符串

时间:2014-06-11 19:18:43

标签: c string recursion integer

我正在学习软件工程,并且遇到了这个练习:它要求用C语言编写递归函数,该函数接收正整数和空字符串,并将数字“转换”为字符串。这意味着在调用函数之后,我们发送的字符串将包含数字,但是作为其数字的字符串。

我写了这个函数,但是当我尝试打印字符串时,它确实打印了我发送的数字,但反过来了。

这是功能:

void strnum(int n, char *str)
{
    if(n)
    {
        strnum(n/10, str+1);
        *str = n%10 + '0';
    }
}

例如,我在函数调用时发送了数字123,输出是321而不是123。

我也试过在if语句中交换两行,但它仍然是一样的。我无法弄清楚我做错了什么。有人可以帮忙吗?

注意:练习不允许使用while和for循环语句。

2 个答案:

答案 0 :(得分:4)

  

注意:您当前的实现设计有点危险,因为您无法知道您是否真的在写有效内存;考虑通过传入len来实现该功能,以便知道何时不应该再写作;即。防止缓冲区溢出


简介

问题在于您正在削减最低有效数字,而是将其分配到str指向的缓冲区中的最重要位置

您需要将" off剃须" "分配" 同步,以便最低有效数字存储在最后 - 而不是开始。


提示

最简单的解决方案是做你目前正在做的事情,然后反向缓冲区,但这将需要比实际需要更多的任务。

推荐的方法是计算字符串中的位数,通过这样做,您将知道结束的偏移量,并开始在此处指定最低有效数字位置。


黑客

另一种选择是让递归调用修改指针的当前值,有效地使其分配正确的值 - 在正确的偏移处。

这个例子主要包括在内,因为它有趣的" ,还有(如上所述)其他行走路径。

#include <stdio.h>

void strnum_impl (int n, char ** str) {
  if (n) {
    strnum_impl (n/10, str);
    **str = n%10 + '0';
    (*str)++;
  }
}

void strnum (int n, char * str) {
  if (n == 0)  {          *str++ = '0'; }
  else         { strnum_impl (n, &str); }

  *str = '\0'; /* null-terminate */
}

int main () {
  char buf[256];

  strnum (10240123, buf);
  printf (">%s<\n", buf);

  return 0;
}

>10240123<

答案 1 :(得分:0)

正如@Robert Harvey评论的那样,代码正在确定最少而不是最重要的数字并将其放在str[0]中。

它实际上看起来像 fun ,所以下面的内容可以处理int的整个范围,包括INT_MIN和任意大小的int

static char *strnum_helper(int n, char *str) {
  str[0] = '0' - n%10;
  if (n < -9) {
    return strnum_helper(n/10, str - 1);
  }
  return str;
}

void strnum(int n, char *str) {
  char buf[(sizeof n * CHAR_BIT)/3 + 3];  // Sized to any size int
  if (n < 0) {
    *str++ = '-';
    }
  else {
    n = -n; // By using negative numbers, do not attempt -INT_MIN
  }
  buf[sizeof buf - 1] = '\0';
  strcpy(str, strnum_helper(n, &buf[sizeof buf - 2]));
}

@FilipRoséen - refp指出了传递size的价值。上述strnum()可以根据size限制进行调整。