在c++中使用递归从字符串中删除所有辅音

Deleting all consonants from a string using recursion in c++

本文关键字:删除 字符串 c++ 递归      更新时间:2023-10-16

我对编程几乎完全陌生,我尝试学习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((函数,但我不知道怎么做。非常感谢。

如果你只想学习递归并"手工"做更多的事情,那么可能更容易查看字符串中是否仍然存在辅音,可能使用z.find_first_of(consonants),其中consonants可能是由所有辅音组成的字符串。如果它返回std::string::npos,则没有找到辅音,您可以返回输入字符串(停止条件(。否则,你可以去掉辅音(你现在知道它的位置了(,也许可以使用z.substr并将辅音前后的子串连接起来。然后用新字符串递归调用函数。

然后,您可以编写一个更通用的函数,该函数使用第二个字符串,该字符串包含要从字符串中删除的所有字符。

此外,使用全局变量作为递归参数不是很好的代码实践,也是代码中最大的缺陷之一(例如,当函数中有两个递归调用时,该怎么办?(。你还需要在函数完成时重置它们,或者你想多次调用它。在您的情况下,使用一个字符串调用函数,该字符串必须从头开始处理,但i可能已经递增。您宁愿将i作为一个参数来指示在哪个字母上开始,或者更好的是,更改函数的结构。当我递归地写函数时,我经常首先想到停止条件:在哪些情况下什么都不做(比如空字符串或没有辅音的字符串(?然后我想到在其他情况下必须做些什么。

无法抵抗

#include <iostream>
#include <string>
#include <cctype>
using namespace std::literals::string_literals;
std::string del_cons(std::string const & str)
{
if (!str.size())
return "";
if (!std::isalpha(static_cast<unsigned char>(str[0])) ||
"AEIOUaeiou"s.find(str[0]) != str.npos )
return str.substr(0, 1) + del_cons(str.substr(1));
return del_cons(str.substr(1));
}
int main()
{
std::string input;
std::getline(std::cin, input);
std::cout << del_cons(input) << 'n';
}

对不起,我无法抗拒。。。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;
}