strlen函数在c中使用递归
我是kida对递归主题的新手,并且我一直在尝试使用recurion来编写“strlen”函数,这就是我尝试过的:
int strlen ( char str[], int i) { if ( str[i] == 0) return i+1; return strlen(str,i++); }
我尝试了一些非常相似的东西
int strlen( char str[], int i) { if ( str[i] == 0) return 1; return strlen(str,i++) + 1; }
在我的主要function
int main() { char word[MAX_DIGITS]; scanf("%s",word); printf("%d", strlen(word,0)); return 0; }
但是每当我运行它时我的程序都会崩溃,我错过了什么? (我用的是C90顺便说一句)
你的问题从这里开始:
i++
这称为后缀。 只需使用++i
或i + 1
Postfix发送值,然后递增变量。 这就像写这个:
return strlen(str,i); i = i + 1;
您必须使用前缀,它会增加变量,然后发送值。 前缀( ++i
)的行为如下:
i = i + 1; return strlen(str,i);
或者只是发送值而不更改变量:
return strlen(str, i + 1);
在我看来,这是最简单的方法。
size_t strlen (char* str) { if (*str == 0) { return 0; } return strlen (str+1) +1; }
所以:
-
strlen ("") == 0
-
strlen ("a") -> strln("") + 1 == 1
-
strlen ("he") -> strln("e") + 1) = (strln("") + 1) + 1 == 2
等等
return strlen(str,i++);
您正在使用错误的增量运算符。 i++
表示i++
的原始值作为参数传递,然后递增。 这意味着无限递归。
你应该尝试++i
,或者更好, i + 1
。
如果你想保持与strlen
相同的原型。 这就是我看到一个递归的strlen。
size_t strlen(char *str) { static int i = 0; if (*str != '\0') { i++; return ft_strlen(++str); } return i; }
我知道这不是最好的方法。 只是我的实施。