c语言中使用递归的strlen函数
我是递归主题的新手,我一直在尝试使用recurion编写“strlen”函数,这就是我尝试的:c语言中使用递归的strlen函数,c,recursion,strlen,C,Recursion,Strlen,我是递归主题的新手,我一直在尝试使用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+
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;
}
在我的主要职能中
int main()
{
char word[MAX_DIGITS];
scanf("%s",word);
printf("%d", strlen(word,0));
return 0;
}
但是我的程序每次运行都会崩溃,我遗漏了什么?(我正在使用C90 btw)
您使用了错误的增量运算符i++
表示i
的原始值作为参数传递,然后递增。这意味着无限递归
size_t strlen(char *str)
{
static int i = 0;
if (*str != '\0')
{
i++;
return ft_strlen(++str);
}
return i;
}
您应该尝试
++i
,或者更好地尝试i+1
您的问题从这里开始:
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);
在我看来,这是最简单的方法。如果你想保持与strlen相同的原型。 这就是我如何看待带递归的strlen
size_t strlen(char *str)
{
static int i = 0;
if (*str != '\0')
{
i++;
return ft_strlen(++str);
}
return i;
}
我知道这不是最好的方法。只是我的实现
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
etc实际上我认为在这种情况下I+1i更清晰,但你的观点是正确的:-)strlen的正确原型是
size\t strlen(const char*s)代码>。不要太担心最好的方法,因为递归永远都不是编写这个函数的最好方法。在现实编程中,使用递归来实现这一点永远是一个可怕的想法。