簡體   English   中英

在C中使用遞歸的strlen函數

[英]strlen function using recursion in c

我是新來的遞歸主題,我一直在嘗試使用遞歸編寫“ 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++

這稱為后綴。 只需使用++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相同的原型。 這就是我看到遞歸的驚奇之處。

size_t strlen(char *str)
{
    static int i = 0;

    if (*str != '\0')
    {
        i++;
        return ft_strlen(++str);
    }
    return i;
}

我知道這不是最好的方法。 只是我的實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM