分段错误(core dumped)递归函数

时间:2015-09-28 00:28:31

标签: c++ arrays string char segmentation-fault

我正在为此递归函数获取分段错误(核心转储),以计算用户输入的字符串中的元音。我的目标是将用户输入的字符串变量复制到字符数组然后小写,并验证该字符是否是元音。验证后,该函数应执行元音计数的递归加法。我在此函数中传递一个0的整数作为参数int L.关于我可以做些什么来修复和改进这部分代码的任何信息都会很棒。

-i

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题:

  1. 你按字符串传递字符串,这很昂贵而且你非常喜欢。
  2. 您将字符串复制到数组?不必要。如果您想通过索引访问,只需在字符串上使用[]运算符。
  3. 为什么不使用迭代器而不是基于索引的访问和传递字符串?
  4. 为什么要递归?迭代对于这项工作来说会很棒。
  5. 正如三十二上校所提到的,tolower不会修改论点。
  6. 为什么会出现分段错误?

    strcpy复制字符串,直到达到null-char。因此,如果不发生分段错误,则需要s.length()+1元素而不是s.length()-1的char数组。

    注意到这些点,这里是修改后的代码:

    int vowels(string::const_iterator beg, string::const_iterator end) {
      int sum = 0;
      if (beg != end) {
        switch (*beg) {
          case 'a':
          case 'A':
          case 'e':
          case 'E':
          case 'i':
          case 'I':
          case 'o':
          case 'O':
          case 'u':
          case 'U':
            return 1 + vowels(++beg, end);
        }
        return vowels(++beg, end);
      }
      return 0;
    }
    

    工作代码:

    #include <string>
    #include <iostream>
    using namespace std;
    int vowels(string::const_iterator beg, string::const_iterator end) {
      int sum = 0;
      if (beg != end) {
        switch (*beg) {
          case 'a':
          case 'A':
          case 'e':
          case 'E':
          case 'i':
          case 'I':
          case 'o':
          case 'O':
          case 'u':
          case 'U':
            return 1 + vowels(++beg, end);
        }
        return vowels(++beg, end);
      }
      return 0;
    }
    int main() {
      string x = "hello canberk";
      cout << vowels(x.begin(), x.end()) << endl;
      return 0;
    }