尝试递归并尝试此练习向后打印一个单词。我究竟做错了什么?
#include <stdio.h>
#include <stdlib.h>
void recursivePrint(char* x){
if (*x = '\0')
return;
else
recursivePrint(x++);
printf("%c", *x);
}
int main()
{
char x[10] = "Hello";
recursivePrint(x);
return 0;
}
答案 0 :(得分:6)
=
是一个赋值运算符。 ==
用于比较。
变化
if (*x = '\0')
要
if (*x == '\0')
修改强>
要查看第一个字符,
更改
void recursivePrint(char* x){
if (*x == '\0')
return;
else
recursivePrint(x++);
printf("%c", *x);
}
要
void recursivePrint(char* x){
if (*x == '\0')
return;
else
recursivePrint(x+1);
printf("%c", *x);
}
答案 1 :(得分:3)
除了要进行比较的赋值(在另一个答案中指出)之外,您不应该递增x
,因为您希望在递归调用之后输出它。增加x
是不必要的,因为您可以看到容易出错。发生的事情是电话号码i
是打印字符i+1
,所以倒数第二个呼叫实际上是将空终止符传递给printf()
;倒数第三个是在NULL之前传递字符,等等。看起来像这样:
recursivePrint("Hello");
recursivePrint("ello");
recursivePrint("llo");
recursivePrint("lo");
recursivePrint("o");
recursivePrint("");
return;
/* x was incremented, points to \0 */
print '\0'
/* x was incremented, points to "o" */
/* ... */
所以基本上,你总是比想要打印的人物要早一个角色。你可以通过将x[-1]
传递给printf()
来修复它,但这很难看。更好的方法是:
void recursivePrint(char *x) {
if (*x == '\0')
return;
recursivePrint(x+1);
printf("%c", *x);
}
这是更好的,因为你从来没有想过/需要首先增加x
。
答案 2 :(得分:1)
试试这个
void recursivePrint(char* x){
if (*x == '\0')
return;
recursivePrint(x+1);
printf("%c", *x);
}
答案 3 :(得分:1)
你很接近,但这里的一些答案不正确并产生了段错误。
#include <stdio.h>
#include <stdlib.h>
void recursivePrint(const char *x) {
if (*x == '\0') {
return;
}
recursivePrint(x+1);
printf("%c", *x);
}
int main(void) {
const char* x = "Hello";
recursivePrint(x);
return 0;
}
您应该使用const char*
,因为您的功能不会修改数据。