Почему программа пропускает cin

Каждый раз, когда вы используете cin >> ans , ans перезаписывается. Если вы хотите продолжить получать ввод после первого пробела, вам нужно использовать цикл, который проверяет ключ ввода, используя std::cin.peek() (или вместо этого использовать что-то вроде std::getline() ), например, так:

#include
#include

int main() std::string ans;
std::cout while (std::cin.peek() != ‘n’) std::cin >> ans;
>
std::cout >

Но вывод здесь, если вход hello world будет

ans: world

Зачем? Поскольку ans был перезаписан, существует два простых способа: использовать массив или вектор для хранения каждого cin отдельно или объединить их все.

Первый способ

#include
#include
#include

int main() std::vector answers;
std::string ans;
std::cout while (std::cin.peek() != ‘n’) std::cin >> ans;
answers.push_back(ans);
>
std::cout for (int ii = 0; ii < answers.size(); ii ++) std::cout >
std::cout >

Который будет выводить (формат вывода может быть легко настроен)

Функция getline()


ans: hello world

Второй метод

#include
#include

int main() std::string ans;
std::string answers = «»;
std::cout while (std::cin.peek() != ‘n’) std::cin >> ans;
answers += ans+» «;
>
std::cout >

Который будет аналогичным образом выводить

ans: hello world

Первый метод более гибок — каждый вход отдельно поддерживается в std::vector и их можно выводить или манипулировать по мере необходимости, второй метод проще только в том, что он не требует включения STL.

Источник: progi.pro

Из-за чего пропускается строка кода?

так думаю, потому что при запуске программы я ввожу только число, затем просто появляется пустая строка, не дав ввести строку
а что с ней происходит?

Читайте также:
Какими программами владеет бухгалтер

SagePtr

Ilya199,
std::cin >> count;
Ввели число, нажали enter. Перевод строки попал в буфер ввода.
Следующая функция
std::cin.getline(user[0].name, 20);
считала то, что было в буфере ввода до перевода строки (а именно — пустую строку).
std::cout Вывела пустую строку, потому что между числом и переводом строки у вас ничего не было.
Программа завершила работу.
Всё правильно отработало, как и должно было.

Источник: qna.habr.com

C++. Программа пропускает строчку кода(считывание переменной)

Доброго времени суток. Возникла проблема с С++. Если кратко — в одной строчке не происходит считывание с помощью потока ввода cin. Код ниже. Место где происходит ошибка — обозначено комментарием.

Пробовал очищать поток перед считыванием user_num_to_sum с помощью cin.clear() — don’t help.

Lesson #33 — Solving the getline() Problem


#include //cin, cout #include //_getch() #include //vector using std::cout; using std::cin; using std::vector; int main () < vectornumbers; // вектор из целых чисел int num = 0; // число которое заносим в конец вектора int user_num_to_sum = 0; // число элементов вектора для суммирования(пример: если число 3, то суммируем первые 3 элемента) cout > num) < numbers.push_back(num);// заносим числа в вектор >cout > user_num_to_sum; // ERROR: программа пропускает данную строчку и выполняет следующую подставляя в user_num_to_sum значение 0, которое было задано при инициализации. cout «; //код еще не готов полностью, программа смысла не имеет _getch(); return 0; >

Я и останавливаю цикл while(cin >> num) вводом ошибочного символа ‘|’. Данный приём использует в своей книге Страуструп. Вот только потом почему-то после остановки цикла не срабатывает считывание целого числа user_num_to_sum.

P.S. Сработал вариант с использованием cin.clear(), но только в случае завершения ввода данных в вектор путём нажатия Ctrl+Z. Если же завершить его путём ввода неверных данных(к примеру ‘|’ при считывании данных типа int), то cin.clear() не срабатывает. Вопрос: почему?

Читайте также:
Как пройти активацию программы

Ответы (2 шт):

while(cin >> num) < // Пока мы можем прочитать int, читаем его . // и что-то делаем >// Вышли из цикла, т. к. int прочитать нельзя . // Тут мы ничего не читали cin >> user_num_to_sum; // Опа! Чиатем ещё int

Но ведь состояние потока не изменилось — int как нельзя было прочитать, так и сейчас нельзя.

Если ввод последовательности чисел заканчивается неким нечисловым вводом, следует прочитать это нечто как строку и только потом считывать следующее число. Если же ввод завершался нажатием ctrl+z, то там вроде вообще eof выставляется.

Также для сброса маркера ошибки надо перед чтением вызвать cin.clear() .

while(cin >> num) < numbers.push_back(num);// заносим числа в вектор >std::string s; cin.clear(); // сбрасываем ошибку в cin cin >> s; // убираем из cin нечисловые символы cout > user_num_to_sum; // ERROR: программа пропускает данную строчку и выполняет следующую подставляя в user_num_to_sum значение 0, которое было задано при инициализации.

Вот так Ваш код будет работать корректно при завершении заполнения вектора любым нечисловым символом.

Собственно, ответ на последний вопрос: cin.clear() сбрасывает флаги (состояние) ошибки в потоке, но последний введенный символ (группа символов) в нем остается, поэтому их нужно оттуда убрать, например в какую-то ненужную строку.

П.С. Вопрос получился неожиданно интересным и заслуживает поощрения в виде плюса.

П.П.С. Нашелся вариант без лишней переменной (проверил, нужно #include )

cout > num) < numbers.push_back(num);// заносим числа в вектор >cin.clear(); // сбрасываем флаг ошибки cin.ignore(std::numeric_limits::max(), ‘n’); // пропускаем все до символа новой строки cout > user_num_to_sum;

Источник: husl.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru