【问题标题】:Segmentation fault (core dumped) recursive function分段错误(核心转储)递归函数
【发布时间】:2015-09-28 00:28:31
【问题描述】:

这个递归函数在计算用户输入的字符串中的元音时遇到了分段错误(核心转储)。我的目标是将用户输入的字符串变量复制到字符数组中,然后小写并验证该字符是否为元音。验证后,该函数应执行元音计数的递归加法。我在此函数中将整数 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 复制一个字符串,直到达到 nul char。所以你需要一个 s.length()+1 元素的 char 数组,如果没有发生分段错误。请做一些调试。
  • 另外tolower 不会修改它的参数,所以调用tolower(str[L]) 是一个空操作。

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


【解决方案1】:

你的代码有几个问题:

  1. 您按值传递字符串,这很昂贵,而且您经常这样做。
  2. 您将字符串复制到数组中?不必要。如果您想按索引访问,只需在字符串上使用 [] 运算符。
  3. 为什么不使用迭代器而不是基于索引的访问和传递字符串?
  4. 为什么要递归?迭代将非常适合这项工作。
  5. 正如三十二上校所提到的,tolower 并没有修改这个论点。

为什么会出现分段错误?

strcpy 复制一个字符串,直到达到 null-char。所以你需要一个s.length()+1元素的char数组而不是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;
}

【讨论】:

    猜你喜欢
    • 2021-01-02
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 2015-06-25
    • 2021-06-03
    相关资源
    最近更新 更多