从控制台读入文本/字符串,直到遇到*

时间:2015-03-06 21:09:47

标签: c++ string

所以我得到的问题/练习说: "输入是文本。编写一个修改输入文本的程序,以便删除所有元音。文本的末尾用*"表示。这是我的英文翻译,可能不是100%准确。

但是如果我必须首先存储值,我应该在遇到*时停止输入,我不能在执行期间检查每个字符。

可能我没有很好地解释这个问题,但在解决方案中,我们清楚地看到输入的字符串在一行中并且它在*之后结束读取值。

是否可以这样做,或者如果我只删除*之后输入的所有内容,是否允许它?

还提供了c ++实现,因为我必须将它用于考试。 (是的,我知道如何删除元音)

以下是我的解决方案,只删除了' *':

之后的所有内容
#include <iostream>
#include <string.h>

using namespace std;

char samoglasnici[5] = {'a','e','i','o','u'}; // samoglasnici == vowels

string obrisiSamoglasnike(string tekst) // obrisiSamoglasnike == deleteVowels
{
    for(int i = 0; i<tekst.length(); i++)
    {
        for(int j = 0; j<5; j++)
        {
            if(tekst[i]==samoglasnici[j])
                tekst[i] = ' ';
        }
    }

    return tekst;
}


int main()
{

    cout << "Unesi neki tekst: " << endl; // enter some text
    string tekst;
    getline(cin, tekst);
    tekst = tekst.substr(0,tekst.find('*') + 1);
    cout << obrisiSamoglasnike(tekst);


    return 0;
}

1 个答案:

答案 0 :(得分:0)

为了好玩,这里是一个密集的版本。除了故意密集,确实告诉你如何

  • 通过操作流缓冲区迭代器
  • 来避免流处理
  • 避免存储临时缓冲区(这意味着如果输入为几千兆字节,解决方案将扩展)
  • 如何在实现&#34; copy_if&#34;的同一循环中使用*作为循环结束条件。

Live On Coliru

#include <iostream>
#include <iterator>
#include <algorithm>

int main() {
    using namespace std;
    ostreambuf_iterator<char> out(cout);
    for(istreambuf_iterator<char> f(cin), l; f!=l; ++f)
        switch(*f) {
            case '*': return 0;
            case 'a': case 'e': case 'i': case 'o': case 'u': continue; 
            default: *out++ = *f;
        }
}
  

免责声明:仅限灵感代码,您的教授不会接受此