从C ++中的字符串中删除辅音

时间:2018-06-06 07:48:28

标签: c++ string c++11 search erase-remove-idiom

这是我的代码:

#include <iostream>
#include <string>
#include<bits/stdc++.h>
using namespace std;

int main() 
{
    int n;
    cin >> n;

    while(n--)
    {
        string str;
        char a[] = {'a','e','i','o','u','A','E','I','O','U'};
        getline(cin, str);

        for(int i=0 ;i<str.length(); i++)
        {
            for(int j=0; j<10; j++)
            {
                if(str[i]==a[j])
                {
                    cout << str[i];
                }
            }
        }

        cout << "\n"; 
    }
    return 0;
}

测试用例是:

HmlMqPhBfaVokhR 
wdTSFuI 
IvfHOSNv 

我没有删除任何东西,但我只打印元音。但是,一些测试用例没有通过。也许这段代码不适用于多个测试用例。请帮帮我。

3 个答案:

答案 0 :(得分:3)

试试这个:

int main()
{
    int n;
    std::cin >> n;
    std::cin.ignore();   // fix
    /* remaining code */
    return 0;
}

<强>&GT;编程以字符串形式查找元音

在字符串中查找元音的最佳方式是使用二进制搜索。这是提示:

  1. 制作char array 元音的向量(按升序排列)
  2. 对于输入字符串的每个字符,std::binary_search 元音阵列。
  3. 如果binary_search返回true,则打印字符串的字符。
  4. SEE LIVE HERE

    #include <iostream>
    #include <string>
    #include <algorithm>
    #include <vector>
    
    int main()
    {
       std::vector <char> a = {'a','e','i','o','u','A','E','I','O','U'};
       std::sort(a.begin(), a.end()); // need sorted, for binary search
    
       std::string str = "HmlMqPhBfaVokhR wdTSFuI IvfHOSNv";
       std::for_each(str.begin(), str.end(), [&](const auto& str_char)->void
       {
          if(std::binary_search(a.begin(), a.end(), str_char)) std::cout << str_char << " ";
       });
    
       return 0;
    }
    

    输出:

    a o u I I O
    

    <强>&GT;用于删除字符串中的元音的程序

    使用 erase-remove idiom ,如果您的实际目标是从用户输入中移除元音str)。

    SEE LIVE HERE

    #include <iostream>
    #include <string>
    #include <algorithm>
    #include <vector>
    
    int main()
    {
       std::vector <char> a = {'a','e','i','o','u','A','E','I','O','U'};
       std::sort(a.begin(), a.end()); // need sorted, for binary search
    
       std::string str = "Hello World";
       str.erase(std::remove_if(str.begin(), str.end(), [&a](const auto& str_char)->bool
       {
         return std::binary_search(a.begin(), a.end(), str_char);
       }), str.end() );
    
       std::cout << str << "\n";
    
       return 0;
    }
    

    输出:

    Hll Wrld
    

    PS :并且避免使用

    #include<bits/stdc++.h>
    using namespace std;
    

    为什么?请参阅thisthis个答案。

答案 1 :(得分:1)

除了已经回答的std::getline问题:

for(int i=0 ;i<str.length(); i++)
{
    for(int j=0; j<10; j++)
    {
        if(str[i] == a[j])
        {
            // this is the one you do NOT want to print...
            // cout<<str[i];
            // skip instead:
            goto SKIP;
        }
    }
    std::cout << str[i]; // output the one NOT skipped...
    SKIP: (void)0;
}

好的,不想开始讨论goto的用法,有很多方法可以避免它,例如: G。通过将内部for循环打包成单独的(内联)函数。但是,你可以更容易,因为已经存在这样的功能;使用基于范围的for循环,代码变得更加容易:

for(auto c : str)
{
    if(!strchr("aeiouAEIOU", c))
    {
        std::cout << c;
    }
}

strchr(来自cstring)返回一个指向字符串中第一个字符的指针,该字符等于引用字符 - 如果找不到则返回nullp ...

要以现代C ++方式真正从字符串中删除元音,请考虑以下事项:

str.erase(std::remove_if(
        str.begin(), str.end(),
        [](char c) { return strchr("aeiouAEIOU", c) != nullptr; }
    ), str.end());

答案 2 :(得分:0)

您的代码可能看起来像(请参阅内联评论):

#include <iostream>
#include <string>
using namespace std;

int main() {
    string vowels = "aeiouAEIOU";

    int n;
    cin>>n; // assume this stands for line count

    while(n-- >= 0)
    {
        string str, result;
        getline(cin, str);

        for(int i=0 ;i<str.length(); i++)
        {
            if (vowels.find(str[i]) != std::string::npos)
                result += str[i];   // add character to result if it is not consonant
        }
        cout<<result<<"\n"; // print result
    }

    return 0;
}