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