元音的字符串操作无法正常工作

时间:2019-06-13 19:23:06

标签: c++ string c++11

下面的程序用于使字符串中的所有字符都小写,删除所有元音,然后在每个字母之前打印一个句号。例如,“伞”的输入将变为“ .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”。 预先感谢。

2 个答案:

答案 0 :(得分:4)

从字符串中删除字符时,其余内容将移至空白处。它们的索引会相应调整。在您的游览示例中,它将类似于以下内容:

tour indexes

从巡回赛中删除“ 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;
}