【问题标题】:Why does this work? Recursive str_length function in c++为什么这行得通? c++中的递归str_length函数
【发布时间】:2019-11-22 16:39:03
【问题描述】:

这是一个递归函数,用于在 c++ 中查找 cstring 的长度。我很高兴我找到了项目问题的答案,但我不知道它为什么会起作用。有问题的行是这一行: "return (str_length(s + 1) + 1);" 我不明白为什么 s+1 作为参数有效。任何澄清都会很可爱。

编辑 该课程没有涵盖指针。

int str_length(char s[])
{
    if (s[0] == 0)
    {
        return 0;
    }
    else
    {
        return (str_length(s + 1) + 1);
    }
}

【问题讨论】:

  • s + 1 将指针移动一个字符。
  • int str_length(char s[]) 实际上是int str_length(char* s)。所以你有指针算术。
  • @wally 所以它调用 s[0+1] 然后 s[1+1] 等等?谢谢你的回答。
  • 如果课程还没有涉及到指针,那么根据您在课程中学到的内容,您无法理解这个程序。在这种情况下,您不应该使用此示例代码。 (尝试按照说明编写自己的代码!)但是请注意,char s[] 用数组语法伪装的指针。您可以像使用数组一样使用它并编写迭代解决方案(而不是所示代码中的递归解决方案),但这在技术上是不正确的,恕我直言,应该在给出这样的分配之前教授指针。

标签: c++ recursion arguments c-strings


【解决方案1】:

char s[] 在函数参数中使用时实际上是char* s,即指向char 的指针,而不是char 的数组。这是一个令人困惑的符号,这就是为什么我建议不要使用它。

传递给函数的是指向 char 数组的第一个元素的指针,函数的工作是在该数组中找到值 '\0' 的第一个字符,并返回该元素在数组。

当您编写s + 1 时,您正在形成一个指向s 指向的数组元素之后的数组元素的指针。然后将其传递给对str_length 的递归调用。

因为递归调用现在需要一个指向包含 C 样式字符串的原始 char 数组的第二个元素的指针,所以它将返回原始字符串的长度减一。在(str_length(s + 1) + 1) 的结果中加一将返回实际字符​​串的长度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多