问题
I'm kida new to the recursion subject and i've been trying to write the "strlen" function using recurion, thats what i tried:
int strlen ( char str[], int i)
{
if ( str[i] == 0) return i+1;
return strlen(str,i++);
}
and i tried something very similiar
int strlen( char str[], int i)
{
if ( str[i] == 0) return 1;
return strlen(str,i++) + 1;
}
and in my main function
int main()
{
char word[MAX_DIGITS];
scanf("%s",word);
printf("%d", strlen(word,0));
return 0;
}
but my program would crash whenever i run it, what am I missing? (I'm using C90 btw)
回答1:
Your problem starts here:
i++
This is called a postfix.
Just use ++i
or i + 1
Postfix sends the value and just then increments the variable. It's like writing this:
return strlen(str,i);
i = i + 1;
You have to use Prefix, which increments the variable and then sends the value. A prefix (++i
) will act like that:
i = i + 1;
return strlen(str,i);
Or just send the value without changing the variable:
return strlen(str, i + 1);
Which, in my opinion, is the simplest way to do that.
回答2:
size_t strlen (char* str) {
if (*str == 0) {
return 0;
}
return strlen (str+1) +1;
}
So :
strlen ("") == 0
strlen ("a") -> strln("") + 1 == 1
strlen ("he") -> strln("e") + 1) = (strln("") + 1) + 1 == 2
etc
回答3:
return strlen(str,i++);
You are using the wrong increment operator. i++
means the original value of i
is passed as argument, and then it's incremented. That means infinite recursion.
You should try ++i
instead, or better, i + 1
.
回答4:
If you want to keep the same prototype as strlen
does.
This is how i see a strlen with recursion.
size_t strlen(char *str)
{
static int i = 0;
if (*str != '\0')
{
i++;
return ft_strlen(++str);
}
return i;
}
I know it's not the best way to do it. Just my implementation.
来源:https://stackoverflow.com/questions/37745442/strlen-function-using-recursion-in-c