如何在没有某些字符的情况下保存字符串?

时间:2017-01-16 09:17:01

标签: c++

我正在编写一个程序,它在没有元音的情况下给出输入字符串。但是它只给出字符串的第一个字符串。这是代码:

 #include<iostream>
 using namespace std;

int main(){

    char ch;
    while(cin.get(ch)){
        cout<<ch;
        char a=cin.peek();
        while( a==65 || a==69 || a==73 || a==79 || a==85 || a==97 || a==101 || a==105 || a==111 || a==117)
            cin.ignore(1 , a);
    }
    return 0;
}

4 个答案:

答案 0 :(得分:1)

要解决这样的问题,首先要将问题分解为更小的部分。可能的分解是:

  1. 是否还有字符要从输入中读取?不,太好了,我们完成了!
  2. 读入角色
  3. 这个角色是元音吗?是的:转到1。
  4. 输出字符
  5. 转到1。
  6. 然后在代码中,您可以将其转换为:

    // 1) Are there characters still to read?
    while (std::cin.good())
    {
        // 2) Read in a character
        char ch;
        std::cin.get(ch);
    
        // 3) Is the character a vowel?
        //     For the test for a vowel, you can use something similar to
        //     what you have at the moment, or better still: consider
        //     writing a function like isVowel in @Shreevardhan answer.
        if ( /* TODO: Test if the character is a vowel... */)
        {
            // Skip the rest of the loop and go back to 1
            continue;
        }
    
        // 4) Output the good character
        std::cout << ch;
    
        // 5) Reached the end of the loop, so goto 1
    }
    

    将问题分解成较小的部分是个好习惯。我经常开始一个新项目,首先写出一个列表/评论(甚至绘制流程图),将问题分解成更易于管理的部分。

答案 1 :(得分:0)

像这样的东西

#include <iostream>
using namespace std;

bool isVowel(char c) {
    c = tolower(c);
    return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
}

int main() {
    char c;
    while (cin.get(c))
        if (!isVowel(c))
            cout << c;
    return 0;
}

在里面添加你的存储逻辑。

更多C ++ - ish代码

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

int main() {
    string s;
    getline(cin, s);
    s.erase(remove_if(s.begin(), s.end(), [](char c) {
        c = tolower(c);
        return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
    }), s.end());
    cout << s;
    return 0;
}

查看demo

答案 2 :(得分:0)

其他答案显示如何以更直观的方式解决此问题。 无论如何,在查看代码时请考虑以下事项:

while( a==65 || a==69 || a==73 || a==79 || a==85 || a==97 || a==101 || a==105 || a==111 || a==117)
            cin.ignore(1 , a);

当您使用a值附近的条件执行while循环时,cin.ignore(1 , a)不会更改a的值,除非异常,否则您不会离开此循环抛出,对吧?

答案 3 :(得分:0)

也许你可以尝试使用升级库。

#include <boost/algorithm/string.hpp>
boost::erase_all(str, "a");