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

这是我所拥有的

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

它似乎适用于我给它的几个整数,但是我有一些疑问。
  • 我没有在末尾显式包含nul字节\0,那么为什么在用printf("%s\n", str);打印时字符串可以正常工作?
  • 我认为我不太擅长进行递归思考。当我在脑海中尝试逐步执行该程序时,我无法跟踪仍在等待执行的内容。有没有更好的方法来查看内部发生的事情,以帮助我学习?
  • 关于代码的其他建议?

  • 我正在使用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问题,您可以执行以下代码。这将创建一个辅助函数,并将当前索引传递给写入。
    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/

    10-11 04:36
    查看更多