这段代码在做什么? C / C ++

时间:2014-11-19 11:30:49

标签: c++ c

有人可以告诉这个递归函数实际上在做什么。我认为它什么也没做,它返回0并且程序停止。

对于字符串:honolulu\0

int fun(char *string){
    if(*string != 'u') return 0;
    return 1 + fun(string + 1);
}

4 个答案:

答案 0 :(得分:2)

它会计算字符串开头的数量。

cout << fun("umbrella"); //prints: "1"
cout << fun("uumbrella"); //prints: "2"

请注意,它假设字符串是&#39; \ 0&#39;终止。与许多旧的C字符串函数类似,它将迭代数组的末尾,直到找到随机的&#39; \ 0&#39;在记忆的某个地方,只要它不断得到你的。

答案 1 :(得分:1)

该函数返回字符串中第一个字符的索引,该字符串不等于字符'u'您可以将其视为一个函数,搜索不是'u'的第一个字符或一个函数计算字符串开头的'u'个字符数。

我会像

那样写
size_t fun( const char *s )
{
    return  *s != 'u' ? 0 : 1 + fun( s + 1 );
}

因此,对于字符串文字"honolulu",函数将返回0,因为字符串文字不包含初始“u”。

如果你需要在字符串中找到第一个字符'u',那么该函数应该写成

size_t fun( const char *s )
{
    return  *s == 'u' || *s == '\0' ? 0 : 1 + fun( s + 1 );
}

在这种情况下,对于上面显示的字符串文字,函数将返回5.它是字符串文字中第一个字符'u'的位置

如果要在字符串中找到任何字符,则可以将该函数定义为

size_t find( const char *s, char c )
{
    return  *s == c || *s == '\0' ? 0 : 1 + fun( s + 1, c );
}

答案 2 :(得分:1)

守则的作用:

您的代码会计算字符串中连续=VLOOKUP(IF(ISERROR(LEFT(B10,FIND(",",B10,1))),B10,LEFT(B10,FIND(",",B10,1))),D10:D12,1,TRUE) 个字母的数量,当它找到不是u的第一个字母时,它会终止,无论是字母还是u。如果任何字母不是\0,它将永远不会遍历整个字符串,因为序列将被破坏 基本上它是recursive,如果字母不是u,则基本条件使它终止,否则它将进行另一次递归调用。

您案件中代码的行为: 对于给定的输入u,将指向数组的第一个索引(指向'h')的指针应用于该函数,然后它将返回honolulu\0,因为在第一次比较时,它会找到一个不是0的字母,因此它将从那里返回,因此不会进行递归调用,可以返回非零整数,因此输出肯定是u

希望这有帮助。

答案 3 :(得分:-1)

由于您要检查字符串中的第一个字符,而不是字符&#39; u&#39;所以它通过返回0终止。