Я пытаюсь написать цикл, который проверяет ввод пользователя, а затем повторяет, если вход плохой. Вход должен быть либо двоичным числом (как строка), либо десятичным числом (как int). У меня есть отдельные функции для проверки этого ввода, но они не вызывают никаких проблем.cin непреднамеренно пропускает пользовательский ввод
Проблема возникает, когда я выбираю 1 или 2, а затем добровольно вводим недопустимое двоичное или десятичное число. На этом этапе цикл do-while повторяется успешно. Программа печатает еще один запрос для ввода пользователем cout
, но когда приходит время для ввода пользователем ввода, программа думает, что есть вход в консоли, прежде чем я даже что-нибудь введу. Я считаю, что это проблема с whitespace/control
символами в буфере, но я не знаю, как это исправить. Я пробовал использовать std::cin >> std::ws
, чтобы очистить любое свободное пространство, но не повезло.
#include <iostream>
#include <string>
#include <limits>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
using std::cout;
using std::cin;
using std::endl;
using std::numeric_limits;
using std::max;
using std::streamsize;
using std::string;
//int toDecimal;
//true is is binary
bool validateBinary(const string &binaryNumber){
for(int i = 0; i < binaryNumber.length(); i++){
if((binaryNumber[i] != 1) && (binaryNumber[i] != 0)){
return false;
}
}
return true;
}
//true if is decimal
bool validateDecimal(){
return cin;
}
int main() {
int conversionType = 0; //we initialize conversionType to a default value of 0 to ensure the copiler it will always have a value
bool isBinary = false;
bool isDecimal = false;
string binaryNumberInput;
int decimalNumberInput;
do {
if(conversionType == 0){
cout << "Enter 1 to convert binary to decimal," << endl;
cout << "2 to convert decimal to binary, " << endl;
cout << "or 3 to exit the program: ";
std::cin >> std::ws; //to clear any whitespace fron cin
cin >> conversionType; //upon a second iteration, this value is read in before a user input is given
}
if(!cin || (conversionType != 1 && conversionType != 2)){
cout << "Incorrect input." << endl;
cin.clear(); //clear the fail bit
cin.ignore(numeric_limits<streamsize>::max(), '\n'); //used to ignore not-numeric input
}
cout << "You have selected option " << conversionType << "." << endl;
if(conversionType == 1){
cout << "Please enter a binary number: ";
cin >> binaryNumberInput;
isBinary = validateBinary(binaryNumberInput);
if(!isBinary){
cout << "The numbered you entered is not a binary number!" << endl;
conversionType = 0;
}
}
if(conversionType == 2){
cout << "Please enter a decimal number: ";
cin >> decimalNumberInput;
isDecimal = validateDecimal(); //true if succeeded, meaning is a number
if(!isDecimal){
cout << "The numbered you entered is not a decimal number!" << endl;
conversionType = 0;
}
}
}
while((conversionType != 1 && conversionType != 2) || (isBinary == isDecimal));
return 0;
}
Спасибо, но для этого задания нам не разрешено использовать какие-либо функции преобразования, иначе это было бы моим первым выбором. – FluffyKittens
@AdamJ В этом случае вы можете использовать общую логику выше для обработки ошибок ввода. Также в следующий раз дайте понять, что вы можете и не можете использовать в вопросе, если это задание. – user657267
Я ценю помощь, но я действительно ищу ответ на вопрос, почему мой код отказывается читать значение cin, когда цикл повторяется. Я хочу знать для своих собственных целей обучения, а не только для того, чтобы конкурировать с заданием. – FluffyKittens