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++ 

这称为后缀。 只需使用++ii + 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; } 

我知道这不是最好的方法。 只是我的实施。