list.push_back, похоже, дублирует последний добавленный элемент - PullRequest
0 голосов
/ 27 мая 2020

Ввод: This_is_a_ [Beiju] _text

Ожидаемый результат: This_is_a_ [Beiju] _text

Фактический результат: This_is_a_ [Beiju] _textt

Кажется, что когда код заканчивается, он добавляет лишний ненужный символ (обратите внимание на дополнительный "t" в конце). Код:

#include <iostream>
#include <list>

using namespace std;
int main() {
    list <char> text;
    char current_char;
    while(true){
        // Revisa si llegamos al final del archivo
        if(cin.peek() != char_traits<char>::eof()){
            cin >> current_char;
            text.push_back(current_char);
        }
        else{
            break;
        }
    }
    for (auto itr = text.begin(); itr != text.end(); itr++){
        cout << *(itr);
    }

    return 0;
}

1 Ответ

3 голосов
/ 27 мая 2020

Это происходит из-за символа новой строки.

Фактически введено This_is_a_[Beiju]_text\n. Когда cin заглядывает в \n, он еще не видит EOF. Когда operator>> затем пытается прочитать следующий символ, он терпит неудачу, потому что он игнорирует разрыв строки как пробел и затем попадает в EOF. Таким образом, значение current_char остается таким же, как и при предыдущем чтении. Это означает, что вы вставите дубликат последнего символа в свой список.

Вместо этого вы можете использовать это:

while(cin >> current_char){
  text.push_back(current_char);
}

cin оценивается как false при достижении EOF, т.е. он остановит l oop, если он больше ничего не может читать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...