Как использовать cin после getline
Использование getline (cin, s) после cin
Мне нужна следующая программа, чтобы взять всю строку пользовательского ввода и поместить ее в строковые имена:
С cin >> number команда перед getline() Команда (однако, я думаю, это проблема), она не позволит мне вводить имена. Зачем?
Я слышал что-то о cin.clear() команда, но я понятия не имею, как это работает или почему это даже необходимо.
Решение
В приведенном выше коде этот бит …
…проверяет оставшуюся часть строки ввода после того, как число содержит только пробел.
Почему бы просто не использовать игнорировать?
Это довольно многословно, поэтому с помощью ignore в потоке после >> x это часто рекомендуемый альтернативный способ отбросить контент до следующей новой строки, но при этом он рискует выбросить непробельный контент и при этом пропустить поврежденные данные в файле. Вы можете или не можете заботиться, в зависимости от того, является ли содержимое файла надежным, насколько важно избежать обработки поврежденных данных и т. Д.
Так когда бы вы использовали clear и ignore?
Так, std::cin.clear() (а также std::cin.igore() ) не обязательно для этого, но полезно для устранения состояния ошибки. Например, если вы хотите дать пользователю много шансов для ввода правильного номера.
Разве это не может быть проще с skipws или подобным?
Еще одна простая, но недоделанная альтернатива ignore для вашего первоначального требования использует std::skipws пропустить любое количество пробелов перед чтением строк …
Другие решения
Еще один способ сделать это, чтобы положить
В качестве альтернативы. Если вы знаете, что номер и имена всегда будут в разных строках.
Вы можете использовать std :: ws для извлечения любых пробельных символов во входном буфере перед использованием getline. Заголовок для std :: ws является sstream.
Или вы можете очистить входной буфер, чтобы прочитать строку
это определено в заголовке stdio.h.
это довольно самоочевидно, в потоке осталось \ n cin >> number использует, который присваивается именам при первом использовании. Повторное использование getline пишет правильное значение сейчас.
Ввод в языке C++ через cin
Использование объекта cin
Особенности считывания символов
Пусть дано время в формате HH:MM. Считать его можно следующим образом:
int h, m;
char c;
cin >> h >> c >> m;
Если установить манипулятор noskipws :
то при считывании символов пробельные символы не будут пропускаться. Для восстановления режима пропуска пробельных символов используется манипулятор skipws :
Особенности считывания строк
Строку целиком до конца строки, вместе с пробельными символами можно считать следующим образом:
Правильное решение будет таким:
int n;
string s, A[100];
cin >> n;
getline(cin, s);
for (int i = 0; i getline после считывания числа n. Дело в том, что cin >> n не считывает конец строки из потока, поэтому последующий вызов getline вернет пустую строку (но зато считает конец строки), поэтому нужно сделать один «холостой» вызов getline перед считыванием всех остальных строк.
Значение, возвращаемое при считывании
bool is_correct;
int a;
is_correct = (cin >> a);
Вместо записи результата в логическую переменную, можно непосредственно использовать его, например, в условной инструкции. Вот так, например, можно проверять, что на вход программе подано два числа через двоеточие:
string word;
while (cin >> word)
<
// Обработать слово в переменной word
>
Или считывание текста по строкам:
string line;
while (getline(cin, s))
<
// Обработать строку в переменной line
>
Поточный ввод-вывод в C++
Поточный ввод-вывод в C++ выполняется с помощью функций сторонних библиотек. В С++, как и в С, нет встроенных в язык средств ввода-вывода.
Библиотека iostream определяет три стандартных потока:
Для их использования в Microsoft Visual Studio необходимо прописать строку:
Для выполнения операций ввода-вывода переопределены две операции поразрядного сдвига:
Возможно многократное назначение потоков:
cout
Ввод информации
При этом из входного потока читается последовательность символов до пробела, затем эта последовательность преобразуется к типу идентификатора, и получаемое значение помещается в идентификатор:
Возможно многократное назначение потоков:
cin >> переменная1 >> переменная2 >>. >> переменнаяn;
При наборе данных на клавиатуре значения для такого оператора должны быть разделены символами (пробел, \n, \t ).
Особого внимания заслуживает ввод символьных строк. По умолчанию потоковый ввод cin вводит строку до пробела, символа табуляции или перевода строки.
Результат выполнения
Для ввода текста до символа перевода строки используется манипулятор потока getline() :
Результат выполнения
Манипуляторы потока
В С++ имеется ряд манипуляторов. Рассмотрим основные:
Манипулятор | Описание |
endl | Помещение в выходной поток символа конца строки ‘\n’ |
dec | Установка основания 10-ой системы счисления |
oct | Установка основания 8-ой системы счисления |
hex | Установка основания 16-ой системы счисления |
setbase | Вывод базовой системы счисления |
width(ширина) | Устанавливает ширину поля вывода |
fill(‘символ’) | Заполняет пустые знакоместа значением символа |
precision(точность) | Устанавливает количество значащих цифр в числе (или после запятой) в зависимости от использования fixed |
fixed | Показывает, что установленная точность относится к количеству знаков после запятой |
showpos | Показывает знак + для положительных чисел |
scientific | Выводит число в экспоненциальной форме |
get() | Ожидает ввода символа |
getline(указатель, количество) | Ожидает ввода строки символов. Максимальное количество символов ограничено полем количество |
Пример Программа ввода-вывода значения переменной в C++
Та же программа, написанная на языке Си
Пример Использование форматированного вывода
Результат выполнения
Еще один пример использования форматированного вывода: для t∈[0;3] с шагом 0,5 вычислить значение y=cos(t).
Результат выполнения
Using getline(cin, s) after cin [duplicate]
I need the following program to take the entire line of user input and put it into string names:
With the cin >> number command before the getline() command however (which I’m guessing is the issue), it won’t allow me to input names. Why?
I heard something about a cin.clear() command, but I have no idea how this works or why this is even necessary.
13 Answers 13
Another way of doing it is to put a
In the code above, this bit.
. checks the rest of the input line after the number contains only whitespace.
Why not just use ignore?
That’s pretty verbose, so using ignore on the stream after >> x is an oft-recommended alternative way to discard content through to the next newline, but it risks throwing away non-whitespace content and in doing so, overlooking corrupt data in the file. You may or may not care, depending on whether the file’s content’s trusted, how important it is to avoid processing corrupt data etc..
So when would you use clear and ignore?
So, std::cin.clear() (and std::cin.ignore() ) isn’t necessary for this, but is useful for removing error state. For example, if you want to give the user many chances to enter a valid number.
Can’t it be simpler with skipws or similar?
Another simple but half-baked alternative to ignore for your original requirement is using std::skipws to skip any amount of whitespace before reading lines.
Русские Блоги
Подробное объяснение cin, cin.get (), getline ()
Тест первый: abcd ( Enter) abcd (вывод) efgh (ввод) efgh (вывод) Если количество вводимых пользователем символов строки впервые меньше 4, программа выполняется нормально!
Тест два: abcdefgh (Enter) abcd ( (Вывод) (вывод строки) Когда число символов, введенных пользователем в первый раз, больше 4, первая строка принимает первые четыре символа ввода, а вторая операция ввода не выполняется, вторая строка Выход пуст. (Обнаружение суперлиги Getline, не будет выполнять Cin после)
ВАЖНО: Когда cin >> читает данные из буфера, если первый символ в буфере является разделителем пробела, табуляции или новой строки, cin >> будет игнорировать и очищать его, Продолжайте читать следующий символ, если буфер пуст, продолжайте ждать. Однако, если чтение прошло успешно, разделитель после символа остается в буфере, а cin >> не обрабатывается 。 ( понимание )
Примечание:
:
2、cin.get()
Функция имеет три формата: без параметров, один параметр, два параметра: cin.get (), cin.get (char ch), cin.get (array_name, Arsize) Чтение персонажей: Введите конечное условие: введите Обработка символов завершения пары ключей: Не сбрасывайте Enter в буфере 、 пробел и таб (важно) 。 cin.get () и cin.get (char ch) используются для чтения символов, и их использование аналогично, то есть: ch = cin.get () и cin.get (ch) эквивалентны.
cin.get(array_name, Arsize) Используется для чтения строки, может принимать пробелы, встречается Enter Завершить ввод, прочитать символы в соответствии с длиной (Arsize), будет Отменить последний ввод символа ( Важно, но не выбрасывайте ПРОБЕЛ и TAB ) 。
3、cin.getline()
4, функция ошибки cin
Механизм обработки ошибок cin, и изучите несколько важных функций: cin.fail (), cin.bad (), cin.good (), cin.clear (), cin.ignore () и т. Д.
ios :: badbit 001 В потоке ввода (вывода) произошла фатальная ошибка, которая необратима
ios :: eofbit 010 достиг конца файла
ios::failbit 100 Не фатальная ошибка во входном (выходном) потоке может быть исправлена
Соответствующая функция 1 or true if rdstate & XX bit is nonzero; otherwise 0。
Недостаточно сбросить флаг ошибки! Было бы хорошо, если бы оставшиеся данные в буфере могли быть очищены! Давайте посмотрим на очень важную функцию ниже!