在阅读K&R的同时,我遇到了整数到字符串函数。我对其进行了快速阅读,并决定自己实施,但是它不是打印而是更新了字符数组。
这是我所拥有的
void inttostr(int number, char str[]) {
static int i;
if (number / 10) {
inttostr(number / 10, str);
}
str[i++] = number % 10 + '0';
}
它似乎适用于我给它的几个整数,但是我有一些疑问。
\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/