Принимая во внимание \ r \ n

0

Я пытаюсь решить проблему на spoj. По-видимому, входные строки заканчиваются на \r\n в соответствии с комментариями. То, что я знаю о \r\n из предыдущих вопросов, - это то, что это вещь в Windows. Я хочу знать, как это учитывать. В настоящее время я использую getline(cin,str) в c++. Что мне делать, чтобы принять во внимание \r\n.

  • 4
    Как бы вы хотели «принять их во внимание»?
  • 0
    @mbratch как в том, как избавиться от него и сохранить строку в строковом объекте
Теги:
newline

2 ответа

4
Лучший ответ

Когда вы используете std::getline(std::cin, str) об этом уже заботится '\n': std::getline() будет читать символы до тех пор, пока не найдет '\n' и вставляет их в str. Однако он не вставляет '\n'.

Таким образом, вы можете застрять с aa '\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";
    }
}
0

Это каретки return/line feeds, которые сообщают вам о конце строки и начале следующего.

  • 1
    Я уверен, что ОП уже знает это. Я думаю, что его вопрос больше связан с тем, как их убрать / добавить обратно во время чтения / записи файла.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню