首页 > 解决方案 > 在c ++中使用递归从字符串中删除所有辅音

问题描述

我对编程几乎完全陌生,我尝试学习 C++。这是第一个让我觉得自己碰壁的任务。我试图搜索,但因为人们通常使用循环来解决问题,所以我找不到任何东西。

我试图找到一个递归解决方案来删除字符串中的所有辅音(我想我知道如何使用循环来解决它,但想扩展我对递归的了解)。

#include <iostream>
#include <string>

using namespace std;

int i = 0;
string s("");

string del_cons(string z){
    if(i == (z.length()-1) ){
        s+= z.substr(i);
        return s;
    }
    else if(z[i] == 'a' || z[i] == 'e' || z[i] == 'i' || z[i] == 'o' || z[i] == 'u'){
        i++;
        s+= del_cons(z.substr(i));
        return s;
    }
    else{
        s+= z.substr(i,1); 
        i++;
        s+= del_cons(z.substr(i));
        return s;
    }
}


int main(){
    string x;
    getline(cin, x);

    cout << del_cons(x) << endl;

    return 0;
}

代码可以编译,但是在使用字符串尝试时,我收到以下错误消息:

terminate called after throwing an instance of 'std::out_of_range'
what():  basic_string::substr: __pos (which is 3) > this->size() (which is 2)

Abgebrochen (Speicherabzug geschrieben)

在玩弄代码时,这一行似乎是问题所在:

s+= del_cons(z.substr(i));

有人可以给我一个提示我做错了什么吗?看来我在滥用 substr() 函数,但我不知道怎么做。非常感谢。

标签: c++recursion

解决方案


抱歉,我无法抗拒……如果充分利用 C++ 的潜力,它就是一门美丽而强大的语言……

#include <string>
#include <iostream>
#include <algorithm>

int main()
{
    std::string s;
    std::getline( std::cin, s );
    s.erase(
        std::remove_if(
            s.begin(),
            s.end(),
            [](unsigned char x){
                return std::string( "aeiouAEIOU" ).find( x ) == std::string::npos;
            }
        ),
        s.end()
    );
    std::cout << s << std::endl;
}

推荐阅读