Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c语言中使用递归的strlen函数_C_Recursion_Strlen - Fatal编程技术网

c语言中使用递归的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+

我是递归主题的新手,我一直在尝试使用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;
}
在我的主要职能中

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)。不要太担心最好的方法,因为递归永远都不是编写这个函数的最好方法。在现实编程中,使用递归来实现这一点永远是一个可怕的想法。