Cin不是“工作”?

时间:2012-10-11 03:12:47

标签: c++

所以,这是我的代码。我必须删除给定文本中的所有“a”和“A”(可以是随机的),但这里是我给出的文本块示例:

  

快速的棕色狐狸跳过一只懒狗。一个   当狐狸绕过弯道时,猫跑开了。   在路上,一名学生是ta-   为他的CS2433课程考试。

我添加了几个其他的cout只是为了看看发生了什么,看来我的cin只是接受给定文本的“The”部分来阅读。

我不确定发生了什么事?我用来运行带有输入文件的文件的unix命令是:./ hw5.out< hw5in.txt 我应该使用不同的东西传入字符串吗?

1 #include <iostream>
2 #include <algorithm>
3 using namespace std;
4
5 int main()
6 {
7
8    string str;
9    cin >> str;
10
11    char chars[] = "aA";
12    cout << str;
13    for (unsigned int i = 0; i < str.length(); i++)
14    {
15 
16
17       str.erase (std::remove(str.begin(), str.end(), chars[i]), str.end());
18    }
19    cout << str;
20    for (int i = 0; i < str.length();i++)
21    {
22       if (str[i] == '\n')
23       {
24          str[i] = '\t';
25       }
26    }
27
28 
29    cout << str;
30
31 }

更新:我用getLine命令写了一段时间,将每次迭代连接成一个变量“text”然后运行我的原始代码所做的一些事情,用文本替换所有str。我很欣赏这些回复,我肯定会通过发布的存储库,谢谢!

4 个答案:

答案 0 :(得分:4)

当到达空白时,事件>>停止。也许你想要std::getline而不是?

std::getline(std::cin, str);

答案 1 :(得分:1)

扩展@cnicutar的答案,这是从std::cin阅读的标准方式,

std::string str;
while (std::getline(std::cin, str))
{
    // str now contains text upto the first newline
}

但是如果要删除所有'a'和'A',更好的方法是一次迭代输入流一个字符。

std::cin >> std::noskipws; // Do not skip whitespaces in the input stream

std::istream_iterator<char> it(std::cin);
std::istream_iterator<char> end;

std::string result;

// Copy all characters except {'a', 'A') to result
std::copy_if(it, end, std::back_inserter(result),
                [](char c) -> bool { return c != 'a' && c != 'A'; }
                );

答案 2 :(得分:0)

要扩展@cnicutar的答案并修复代码中的其他内容:

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

int main()
{
    char* to_remove = "aA";

    while (!std::cin.eof())
    {
        std::string str;
        std::getline(std::cin, str);

        if (std::cin.fail())
        {
            std::cerr << "Error reading from STDIN" << std::endl;
            return 1;
        }


        size_t index = 0;

        while ((index = str.find_first_of(to_remove, index)) != string::npos)
        {
            str.erase(index);
        }

        std::cout << str << std::endl;
    }

    return 0;
}

答案 3 :(得分:0)

这很简短,相当简单。它显示了一种从输入流和公共erase-remove idiom构建std::string的方法。

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

bool is_aorA(char ch)
{
    return ch == 'a' || ch == 'A';
}

int main()
{
    std::istreambuf_iterator<char> input(std::cin), end;
    std::string str(input, end);

    str.erase(std::remove_if(str.begin(), str.end(), is_aorA), str.end());

    std::cout << str << '\n';
}

ideone.com

中查看此操作