下面的程序用于使字符串中的所有字符都小写,删除所有元音,然后在每个字母之前打印一个句号。例如,“伞”的输入将变为“ .m.b.r.l.l”。但是当我输入“游览”时,不会删除“ u”。
char ChangeToLow(char letter) {
if(letter <= 'Z' && letter >= 'A')
return letter - ('A' - 'a');
return letter;
}
int main()
{
string name;
cin>>name;
for (int i = 0 ; i < name.length() ; i++)
{
name[i] = ChangeToLow(name[i]);
if (name[i] == 'y' || name[i] == 'a'|| name[i] == 'u'|| name[i] == 'i'|| name[i] == 'e'|| name[i] == 'o')
{
name.erase(i,1);
}
}
for (int i = 0 ; i < name.length() ; i++)
{
cout<<'.'<<name[i];
}
}
我希望输出“ .t.r”,但它将输出“ .t.u.r”。 预先感谢。
答案 0 :(得分:4)
从字符串中删除字符时,其余内容将移至空白处。它们的索引会相应调整。在您的游览示例中,它将类似于以下内容:
从巡回赛中删除“ o”后,您的循环计数器i
已增加到2,而name[i]
现在是“ r”。避免此行为的一种方法是在删除元音时递减i
。
答案 1 :(得分:0)
我对你有一些建议。首先,您不应该在代码中放入using namespace std;
。这只会增加混乱,被认为是不好的做法。我认为,如果您考虑学习STL,如果您的目标是深入学习C ++,那也是一件好事。至于错误,我认为已经发布的答案表明您的假设错误。
#include <iostream>
#include <cstdlib>
#include <locale>
#include <set>
#include <algorithm>
int main()
{
std::string name;
std::cin>>name;
std::set<char> vowels={'a','u','i','e','o'};
std::transform(name.begin(), name.end(), name.begin(), [](auto v){ return std::tolower(v, std::locale());});
auto iter=std::remove_if(name.begin(), name.end(), [&vowels](auto v){ return vowels.find(v)!=vowels.end();});
name.erase(iter,name.end());
for (int i = 0 ; i < name.length() ; i++)
{
std::cout<<'.'<<name[i];
}
return EXIT_SUCCESS;
}