我正在尝试解决有关spoj的问题。显然,输入行根据注释以\r\n
结尾。我从之前的问题中了解到的\r\n
是它的窗户。我想知道的是如何将其考虑在内。目前我在c ++中使用getline(cin,str)
。我该怎么做才能考虑\r\n.
答案 0 :(得分:4)
当您使用std::getline(std::cin, str)
时'\n'
已被处理:std::getline()
将读取字符,直到找到'\n'
并将其插入str
。但是,它不会插入'\n'
。
因此,您可能会遇到字符串末尾的'\r'
。如果您使用的是Windows,则只需在文本模式下打开文件,流也会提取它们。如果这不是可行的方法,您可以确定str
是否以'\r'
结尾并将其删除:
if (!str.empty() && str[str.size() - 1] == '\r') {
str.erase(str.end() - 1);
}
如果你想删除所有回车(理论上可能有一些嵌入在字符串中),你可以使用
str.erase(std::remove(str.begin(), str.end(), '\r'), str.end());
最后,如果您不想遇到回车符,可以创建一个过滤流缓冲区,它只删除所有'\r'
(或仅删除"\r\n"
序列中的那些)。下面是一个简单的过滤流缓冲区如何实现的快速示例:
#include <algorithm>
#include <iostream>
#include <streambuf>
#include <string>
class crfilter
: std::streambuf
{
std::istream* stream;
std::streambuf* sbuf;
char buffer[8];
int underflow() {
std::streamsize n;
while (this->gptr() == this->egptr()
&& (n = this->sbuf->sgetn(buffer, 8))) {
char* end = std::remove(buffer, buffer + n, '\r');
this->setg(buffer, buffer, end);
}
return this->gptr() == this->egptr()
? std::char_traits<char>::eof()
: std::char_traits<char>::to_int_type(*this->gptr());
}
public:
crfilter(std::istream& in): stream(&in), sbuf(in.rdbuf(this)) {}
~crfilter() { stream->rdbuf(this->sbuf); }
};
int main()
{
crfilter filter(std::cin);
std::string str;
while (std::getline(std::cin, str)) {
std::cout << "str='" << str << "'\n";
}
}
答案 1 :(得分:0)
它们是回车/换行符,告诉您行的结束和下一行的开头。