gpt4 book ai didi

c++ - 考虑到\r\n

转载 作者:行者123 更新时间:2023-11-27 23:11:17 28 4
gpt4 key购买 nike

我正在尝试解决 spoj 上的问题。显然,根据注释,输入行以 \r\n 结尾。我从之前的问题中了解到的关于 \r\n 的信息是它是 Windows 的东西。我想知道的是如何考虑它。目前我在 C++ 中使用 getline(cin,str)。我该怎么做才能考虑到 \r\n.

最佳答案

当您使用 std::getline(std::cin, str) 时,'\n' 已被处理:std::getline () 将读取字符,直到找到 '\n' 并将它们插入到 str 中。但是,它不会插入 '\n'

因此,您可能会遇到字符串末尾的 a '\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";
}
}

关于c++ - 考虑到\r\n,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20202591/

28 4 0
文章推荐: c++ - 在这种情况下我们可以避免使用默认构造函数吗?
文章推荐: javascript - 为什么这不会从