0

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

敏捷的棕色狐狸跳过一只懒惰的狗。当狐狸绕过弯道时,一只猫跑了。再往前走,一名学生正在参加 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命令写了一段时间,将每次迭代连接成一个变量“文本”,然后运行我的一些原始代码所做的,用文本替换所有str。感谢您的回复,我肯定会浏览发布的存储库,谢谢!

4

4 回答 4

4

>>当达到空白时,事情就停止了。也许你想要std::getline

std::getline(std::cin, str);
于 2012-10-11T03:15:15.840 回答
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'; }
                );
于 2012-10-11T03:30:06.287 回答
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;
}
于 2012-10-11T03:28:45.310 回答
0

这是简短且相当简单的。它展示了一种std::string从输入流和常见的擦除删除习语构造 a 的方法。

#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上查看它的实际应用

于 2012-10-11T03:54:01.897 回答