我是一名初学者,正在学习如何使用C++。我正在尝试完成CodeWars上的挑战。程序应该接受一个字符串输入,并删除字符串中包含的所有元音字母。
首先,我创建了一个包含小写和大写元音字母的字符数组。 然后我使用std :: find函数搜索输入。我想要发生的事情是: 如果它能在数组中找到当前字符,它将删除该字符,并重新开始循环。它能够分离出元音字母,但当我尝试返回修改后的字符串时,遇到了一个内存越界的错误。
我仍然不太明白内存是如何工作的,所以我希望得到一些帮助。
谢谢你的帮助。
首先,我创建了一个包含小写和大写元音字母的字符数组。 然后我使用std :: find函数搜索输入。我想要发生的事情是: 如果它能在数组中找到当前字符,它将删除该字符,并重新开始循环。它能够分离出元音字母,但当我尝试返回修改后的字符串时,遇到了一个内存越界的错误。
我仍然不太明白内存是如何工作的,所以我希望得到一些帮助。
#include <string>
#include <iostream>
#include <conio.h>
#include <algorithm>
using namespace std;
string disemvowel(string str)
{
char vowels[] = { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' };
char *finder;
for (int i = 0; i < str.length(); i++)
{
char active = str[i];
finder = find(vowels, vowels + 10, active);
if (finder != vowels + 10)
{
str.erase(str[i], 0);
}
}
return str;
}
int main() {
string str;
cout << "say something \n";
cin >> str;
cout << disemvowel(str);
_getch();
return 0;
}
谢谢你的帮助。
remove_if
的参考页面以查看示例 https://en.cppreference.com/w/cpp/algorithm/remove - JohnFilleaustring::erase
函数将str[i]
的字符值转换为整数,并尝试删除从str[i]
开始的 0 个字符。根据您的使用方式,您应该使用str.erase(i, 1)
来删除从索引i
开始的 1 个字符。 - JohnFilleaustd::begin(vowels)
代替vowels
,并使用std::end(vowels)
代替vowels + 10
作为您的范围。您的代码可以正常工作,这只是一种风格问题,但我发现这些包装器使其明确它们是迭代器。这还使您的代码更加健壮,以应对vowels
大小的任何更改,这不太可能发生(除非您的要求发生变化,现在必须包括y
和Y
)。 - JohnFilleaustd::remove_if
。您的问题标题正是remove_if
的目的——根据特定条件从值序列中删除项目。 - PaulMcKenziestd::remove_if
,您只需擦除一次。remove_if
只是交换以将“坏”字符移动到序列的末尾。然后在最后执行单个erase
调用。 - PaulMcKenzie