我正在学习软件工程,并且遇到了这个练习:它要求用C语言编写递归函数,该函数接收正整数和空字符串,并将数字“转换”为字符串。这意味着在调用函数之后,我们发送的字符串将包含数字,但是作为其数字的字符串。
我写了这个函数,但是当我尝试打印字符串时,它确实打印了我发送的数字,但反过来了。
这是功能:
void strnum(int n, char *str)
{
if(n)
{
strnum(n/10, str+1);
*str = n%10 + '0';
}
}
例如,我在函数调用时发送了数字123,输出是321而不是123。
我也试过在if语句中交换两行,但它仍然是一样的。我无法弄清楚我做错了什么。有人可以帮忙吗?
注意:练习不允许使用while和for循环语句。
答案 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
限制进行调整。