Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 分段故障(堆芯转储)递归函数_C++_Arrays_String_Char_Segmentation Fault - Fatal编程技术网

C++ 分段故障(堆芯转储)递归函数

C++ 分段故障(堆芯转储)递归函数,c++,arrays,string,char,segmentation-fault,C++,Arrays,String,Char,Segmentation Fault,我得到了这个递归函数的分段错误核心转储,用于计算用户输入的字符串中的元音。我的目标是将用户输入的字符串变量复制到一个字符数组中,然后小写,并验证该字符是否为元音。验证后,函数应执行元音计数的递归加法。我正在传递一个0的整数作为此函数中的参数int L。关于我能做些什么来修复和改进这部分代码的任何信息都将非常棒 #include <iostream> #include <cstring> #include <string> #include <cctype

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

#include <iostream>
#include <cstring>
#include <string>
#include <cctype>

using namespace std;

int vowels(string s, int L)
{
 int sum = 0;
 char str[s.length()-1];

 strcpy(str,s.c_str());

    if(str[L])
    {
        tolower(str[L]);

        if(str[L]!='a'||str[L]!='e'||str[L]!='i'||str[L]!='o'||str[L]!='u')
            sum = 0;
        else
            sum = 1;
        return sum += vowels(s,L++);
    }
    else
        return 0;
}

您的代码有几个问题:

您按值传递字符串,这很昂贵,而且您经常这样做。 是否将字符串复制到数组中?没必要。如果您想通过索引进行访问,只需对字符串使用[]运算符。 为什么不使用迭代器而不是基于索引的访问和传递字符串? 为什么是递归?迭代将是伟大的这项工作。 正如三十二上校提到的,托洛尔并没有修改这个论点。 为什么会发生分割错误


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

注意这些要点,下面是一个修改后的代码:

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;
}

strcpy复制字符串,直到达到nul char。所以您需要一个由s.length+1元素组成的字符数组,如果没有发生分段错误的话。请进行一些调试。而且tolower不会修改它的参数,所以调用tolowerstr[L]是不可行的。