所以,这是我的代码。我必须删除给定文本中的所有“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。我很欣赏这些回复,我肯定会通过发布的存储库,谢谢!
答案 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';
}
中查看此操作