c - 关于C整数转字符串函数的一些问题

标签 c

在通读 K&R 时,我遇到了整数到字符串 函数。我快速阅读了它,并决定自己实现它,但它不是打印,而是更新字符数组。

这是我的

void inttostr(int number, char str[]) {
    static int i;  
    if (number / 10) {
        inttostr(number / 10, str); 
    }       
    str[i++] =  number % 10 + '0';      
}

它似乎适用于我给它的几个整数,但我有一些问题。

  1. 我没有在末尾明确包含 nul 字节 \0,那么为什么使用 printf("%s\n", str); 打印时字符串可以正常工作? ?
  2. 我不认为我很擅长递归思考。当我尝试逐步执行脑海中的程序时,我忘记了仍在等待执行的内容。有没有更好的方法来了解内部发生的事情,以帮助我学习?
  3. 对代码还有其他建议吗?

我正在使用 Xcode。

不是作业。我只是在学习。

谢谢!

最佳答案

你是对的,你从来没有写过 NUL,这是一个错误。

一般来说,您不必考虑整个解决方案。你只需要确保每一步都是正确的。所以在这种情况下,你说:

1 。 inttostr(number/10, str);

将处理除最后一位以外的所有数字。

2。然后我会处理最后一个。

不过,您可以追踪正在发生的事情。例如54321 它看起来像:

inttostr(54321, str); // str = ...;
inttostr(5432, str); // str = ...;
inttostr(543, str); // str = ...;
inttostr(54, str); // str = ...;
inttostr(5, str); // str = ...;
str[0] = '5'; // str = "5...";
str[1] = '4'; // str = "54...";
str[2] = '3'; // str = "543...";
str[3] = '2'; // str = "5432...";
str[4] = '1'; // str = "54321...";

请注意,如果您在写入第一个字符之前没有从任何函数返回,那么您将以与调用相反的顺序返回。

... 表示您没有以 NUL 结尾。另一个问题是您使用的是静态变量,因此您的代码不可重入;这意味着它在某些情况下会中断,包括多线程。

要解决重入和 NUL 问题,您可以执行类似以下代码的操作。这将创建一个辅助函数,并将当前索引传递给 write。

void inttostr_helper(int number, char str[], int *i)
{
    if (number / 10) {
        inttostr_helper(number / 10, str, i); 
    }       
    str[(*i)++] =  number % 10 + '0';
    str[*i] = '\0';
}

void inttostr(int number, char str[])
{
  int i = 0;
  inttostr_helper(number, str, &i);
}

编辑:修复了非静态解决方案。

关于c - 关于C整数转字符串函数的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3655221/

相关文章:

c - 如何在 x86 上使用 gcc 强制执行内存排序

c - 在c中使用参数作为输出

c - 在 C 中生成二进制输入

c - 马里昂巴德游戏错误异或

linux - 具有多个子进程的管道

c - 使用斜率的 C 中的微 Controller 峰值检测

java - 带内存的循环内递归的运行时复杂度

c - 将字符串重新排列成回文 C

c - 带冒号分隔符的 sscanf

c - 函数不在头文件中的单元测试 C