Como lidar com input de tipo de dados incorreta

Em C ++, como você lida com inputs erradas? Como, se o programa pede um inteiro, quando você digita um caractere ele deve ser capaz de fazer algo e então repetir a input, mas o loop é infinito quando você insere um caracter quando um inteiro é necessário e vice-versa.

O motivo pelo qual o programa entra em um loop infinito é porque o sinalizador de input incorreta do std::cin é configurado devido à falha na input. A coisa a fazer é limpar esse sinalizador e descartar a input incorreta do buffer de input.

 //executes loop if the input fails (eg, no characters were read) while (std::cout < < "Enter a number" && !(std::cin >> num)) { std::cin.clear(); //clear bad input flag std::cin.ignore(std::numeric_limits::max(), '\n'); //discard input std::cout < < "Invalid input; please re-enter.\n"; } 

Veja a FAQ do C ++ para isto, e outros exemplos, incluindo a adição de um mínimo e / ou máximo na condição.

Outra maneira seria obter a input como uma string e convertê-la em um inteiro com std::stoi ou algum outro método que permita verificar a conversão.

A resposta mais votada cobre a solução muito bem.

Além dessa resposta, isso pode ajudar a visualizar o que está acontecendo um pouco melhor:

 int main() int input = 1;//set to 1 for illustrative purposes bool cinState = false; string test = "\0"; while(input != -1){//enter -1 to exit cout < < "Please input (a) character(s): ";//input a character here as a test cin >> input; //attempting to input a character to an int variable will cause cin to fail cout < < "input: " << input << endl;//input has changed from 1 to 0 cinState = cin;//cin is in bad state, returns false cout << "cinState: " << cinState << endl; cin.clear();//bad state flag cleared cinState = cin;//cin now returns true and will input to a variable cout << "cinState: " << cinState << endl; cout << "Please enter character(s): "; cin >> test;//remaining text in buffer is dumped here. cin will not pause if there is any text left in the buffer. cout < < "test: " << test << endl; } return 0; } 

Dumping o texto no buffer para uma variável não é particularmente útil, no entanto, ajuda a visualizar porque cin.ignore() é necessário.

Também notei a mudança na variável de input porque, se você estiver usando uma variável de input em sua condição para um loop while, ou uma instrução switch, ela pode entrar em deadlock, ou pode preencher uma condição que você não estava esperando, pode ser mais confuso para depurar.

Teste a input para ver se é ou não o que seu programa espera. Se não estiver, alertar o usuário de que a input fornecida é inaceitável.

Você pode verificá-lo através do valor ASCII se o valor ascii for entre 65 a 90 ou 97 a 122, o caracter seria.