从字符串C ++中删除元音

时间:2018-06-13 20:13:59

标签: c++ regex string str-replace

所以我是C ++的新手,并尝试创建一个可以从字符串中删除元音的函数,但是我很失败,到目前为止这是我的代码:

#include <string>
using namespace std;
string remove(string st) {
    for(int i = 0; st[i] != '\0'; i++) 
        st[i] = st[i] == 'a' || st[i] == 'e' || st[i] == 'i' || st[i] == 'o' || st[i] ==
        'u' || st[i] == 'A' || st[i] == 'E' || st[i] == 'I' || st[i] == 'O' || st[i] ==
        'U' ? '' : st[i];
    }
return st;

这似乎引发了错误?知道我做错了什么

我得到的错误是:

main.cpp:10:16: error: expected expression 'U' ? '' : Z[i];

在另一位翻译上运行:

   .code.tio.cpp:7:14: error: incompatible operand types ('const char *' and '__gnu_cxx::__alloc_traits<std::allocator<char>, char>::value_type' (aka 'char'))
            'U' ? "" : Z[i];
                ^ ~~   ~~~~

3 个答案:

答案 0 :(得分:6)

根据谓词(条件)从顺序容器中删除元素的规范方法是使用std::remove_if。与其名称暗示不同,此标准算法并未完全删除元素,它将它们移动到容器的背面,因此它们易于擦除,使其他元素保持完整且顺序相同。它返回一个迭代器,指示包含&#34;删除&#34;的容器部分的开头。元素。由于标准算法不能改变它们操作的容器的大小,因此必须使用容器的适当移除方法来移除这些元素。如果是std::string,那就是std::string::erase

std::remove_if接受一对迭代器,它们定义要检查的元素范围,以及用于确定要删除哪些元素的谓词。删除谓词为true的元素。

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

// Returns true if p_char is a vowel
bool is_vowel(const char p_char)
{

    constexpr char vowels[] = { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' };
    return std::find(std::begin(vowels), std::end(vowels), p_char) != std::end(vowels);
}

std::string remove_vowel(std::string st) 
{
    // Moves all the characters for which `is_vowel` is true to the back
    //  and returns an iterator to the first such character
    auto to_erase = std::remove_if(st.begin(), st.end(), is_vowel);

    // Actually remove the unwanted characters from the string
    st.erase(to_erase, st.end());
    return st;
}

int main()
{
    std::cout << remove_vowel("Hello, World!");
}

答案 1 :(得分:2)

''不是有效字符,你不能将“空”字符(在C ++中不存在这样的东西)放入字符串中以删除内容......

你可以做的是移动非元音,i。即辅音,前面,跳过元音,然后在末尾删除多余的字符:

auto pos = st.begin();
for(auto c : st)
{
    if(isConsonant(c))
        *pos++ = c;
}
st.erase(pos, st.end());

编辑:正如François(正确)表示:没有必要重新发明轮子(假设您不被禁止使用标准库):

st.erase(std::remove_if(st.begin(), st.end(), [](char c) { return isConsonant(c); }), st.end());

请注意std::remove_if(以及std::remove)“删除”只需将元素移到前面并将迭代器返回到新的数据末尾 - 但不会真正删除元素“落后”新的结局。因此,有必要明确erase如上所示。

答案 2 :(得分:0)

代码如下:-

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

std::string RemoveVowel(std::string &text)
{
    unsigned int len = text.length();
    char vowels[] = { 'a','e','i','o','u','A','E','I','O','U'};
    for (int i = 0; i < len; i++)
    {
        for (char& ref : vowels)
        {
            if (text[i] == ref)
            {
                text[i] = '\0';
            }
        }
    }
    return text;
}

int main()
{
    std::string var = "THIS IS SO MUCH FUN!";
    std::string var2 = "this is so much fun!";
    std::cout << RemoveVowel(var) << std::endl;
    std::cout << RemoveVowel(var2) << std::endl;

    return 0;
}

只需遍历字符串和元音数组,如果两个字符都匹配,则将字符串的当前字符设置为空,这将删除元音。

输出:- enter image description here