【问题标题】:Write a recursive function in C that converts a number into a string用 C 编写一个递归函数,将数字转换为字符串
【发布时间】:2014-08-01 23:33:18
【问题描述】:

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

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

这是函数:

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

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

我还尝试在 if 语句中交换两行,但仍然如此。我不知道我做错了什么。有人可以帮忙吗?

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

【问题讨论】:

  • 因为*str = n%10 + '0'; 发生在递归调用之后,所以你的数字会倒退。脑补代码执行,你会看到的。
  • @RobertHarvey 我认为在这种情况下,无论递归调用在哪里,它都会反转。第一次调用(即第一级递归)将始终打印 3
  • 该函数需要修改,以便在退出所有后续递归后将值放入字符串中,最终递归级别将第一个字符放入字符串中。 IE。 'str' 应该在退出递归之前递增,而不是作为调用下一个递归的一部分。

标签: c string recursion integer


【解决方案1】:

注意:您当前的实现设计有些危险,因为您无法知道自己是否真的在有效内存中编写;考虑使用传入的len 来实现该函数,以了解何时不应再尝试编写; IE。防止缓冲区溢出


简介

问题是您正在删除最低有效位,但将其分配给str 指向的缓冲区中的最高有效位置。 p>

您需要同步 "off shaving""assigning",以便将最低有效位存储在末尾 - 而不是开头.


提示

最简单的解决方案是执行您当前正在执行的操作,然后反转缓冲区,但这将需要比实际需要更多的分配。

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


破解

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

这个例子主要是因为它“有趣”,还有(如前所述)其他路径。

#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<

【讨论】:

  • 是否可以去掉最高位,从而避免逆向操作?
  • @anthropomorphic 在数学上去除最高有效位要困难得多,C 中的实现可能必须添加另一个循环,直到我们只剩下一个数字n(意义;最重要的)。
【解决方案2】:

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

实现起来确实有趣,所以下面的代码很好地处理了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]));
}

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

【讨论】:

    猜你喜欢
    • 2015-11-27
    • 2015-05-12
    • 2021-12-15
    • 1970-01-01
    • 2015-07-14
    • 2014-12-03
    • 1970-01-01
    相关资源
    最近更新 更多