while (!correct)
{
cout << "Please enter an angle value => ";
cin >> value; //request user to input a value
if(cin.fail()) // LINE 7
{
cin.clear(); // LINE 9
while(cin.get() != '\n'); // LINE 10
textcolor(WHITE);
cout << "Please enter a valid value. "<< endl;
correct = false;
}
else
{
cin.ignore(); // LINE 18
correct =true;
}
}
Привет, это часть кода, который я написал.
Целью этого кода является ограничение пользователей на ввод чисел, таких как 10,10,00 и т. Д.,
если они вводят такие значения, как (abc,! $ @ и т. д.), код будет запрашивать у пользователей повторный ввод значений.
Чтобы выполнить эту функцию (запретить пользователю вводить действительные значения), я получаю несколько советов и руководств на форумах.
Я считаю, что я обязан изучать и понимать, что делают эти коды … так как я впервые использую этот код.
может кто-нибудь кратко объяснить мне, что делает коды в
Строка 7,9,10, а 18 сделать? Особенно строка 10. Я получил краткое представление о других, просто строка 10, я не знаю, что он сделал.
Спасибо за ваши гиды, я ценю это!
cin.fail()
сообщает вам, «что-то не получилось» в предыдущей операции ввода. Я считаю, что есть четыре распознанных состояния входного потока: bad
, good
, eof
а также fail
(но fail
а также bad
может быть установлен одновременно, например).
cin.clear()
сбрасывает состояние до good
,
while(cin.get() != '\n') ;
будет читать до конца текущей строки ввода.
cin.ignore();
будет пропускать до следующего перехода на новую строку, поэтому очень похож на while(cin.get() != '\n');
,
Весь код должен также проверять конец файла, или он будет зависать (цикл навсегда с ошибкой), если не будет введен правильный ввод, а ввод «закончен» (например, CTRL-Z или CTRL-D в зависимости от платформы).
// LINE 7:
cin.fail () определяет, соответствует ли введенное значение значению, определенному в переменной.
// LINE 18:
cin оставляет символ новой строки в потоке. Добавление cin.ignore () к следующей строке очищает / игнорирует новую строку из потока.
Для строки 7 и строки 9 прочитайте документ.
while(cin.get() != '\n'); // LINE 10
в while
, проверяет ли линия cin.get()
является пустой строкой, т.е. содержит только новую строку.
Строка 7: проверить правильность введенных данных (можно прочитать как decltype(value)
). cin.fail()
всегда true
если произошла ошибка с потоком. Позже
строка 9: вы очищаете cin
состояние от плохого к предыдущему, нормальное состояние. (восстановить после ошибки). Вы не можете больше читать данные, пока не восстановитесь из плохого состояния.
Строка 10: вы читаете до конца строки. В основном вы пропускаете одну строку из ввода
Строка 18: эта строка выполняется, только если введенные данные исправлены. Он читает и отбрасывает одну строку из стандартного ввода.
while (cin.get ()! = ‘\ n’): вся строка в c заканчивается нулем. Это означает, что \ n является концом всех строковых объектов. Допустим, у вас есть строка «this» для c именно this \ n, каждый алфавит хранится в типе char. Пожалуйста, прочитайте вместе
http://www.functionx.com/cpp/Lesson16.htm
cin.fail (): cin.fail () определяет, соответствует ли введенное значение значению, определенному в переменной.
читать:http://www.cplusplus.com/forum/beginner/2957/
cin.ignore (): извлекает символы из последовательности ввода и отбрасывает их
http://www.cplusplus.com/reference/istream/istream/ignore/
Я знаю, что в Stack Overflow не принято просто перечислять ссылки, поэтому я приведу немного больше деталей, но этот ответ действительно сводится к куче ссылок.
Для строки 7 просто гуглите cin.fail. Вот хорошая ссылка, и что это говорит:
Возвращает значение true, если для потока установлены флаги состояния сбоя или ошибки бита (или обоих).
По крайней мере один из этих флагов устанавливается, когда во время операции ввода возникает какая-либо ошибка, отличная от достижения конца файла.
failbit обычно устанавливается операцией, когда ошибка связана с внутренней логикой самой операции; дальнейшие операции в потоке могут быть возможны. В то время как badbit обычно устанавливается, когда ошибка влечет за собой потерю целостности потока, которая, вероятно, сохранится, даже если в потоке предпринята другая операция. Badbit можно проверить независимо, вызвав функцию-член bad:
Однострочный перевод: он сообщает, произошла ли непредвиденная ошибка при попытке чтения входного потока.
Вы можете найти похожие ссылки для cin.ignore, cin.clear а также cin.get. Краткое резюме:
cin.ignore — игнорировать один единственный символ, присутствующий в потоке.
cin.clear — очистить все флаги ошибок в потоке
cin.get — получить по одному персонажу за раз, пока вы не нажмете на новую строку '\n'
персонаж.
Стандартный поток ввода (cin
) может потерпеть неудачу по ряду причин.
Например, если value
является int
и пользователь вводит большое число, как
124812471571258125
, cin >> value
потерпит неудачу, потому что число слишком велико, чтобы поместиться в int
,
Существует гораздо более простой способ сделать то, что вы хотите. Вы хотите, чтобы пользователь вводил только допустимые значения с плавающей точкой, например, 10 или 10.00, но без символов, верно? Так что вы можете просто сделать это:
double value;
cout << "Please enter an angle value: " << endl;
while (!(cin >> value)) { //Since value is a double, (cin >> value) will be true only if the user enters a valid value that can be put inside a double
cout << "Please enter a valid value:" << endl;
}
Это делает то же самое, что и ваш код, но гораздо проще.
Если вы заинтересованы в том, что может вызвать другие вещи cin
чтобы потерпеть неудачу, посмотрите здесь:
http://www.cplusplus.com/forum/beginner/2957/