Я написал код для угадывания секретного числа, но у меня проблема, когда вместо целого числа вводится буквенный символ вместо целого числа. Это останавливает программу. Что, как я могу противостоять этой проблеме.
srand(time(0));
int a,secret;
secret=rand() % 10 +3;
do{
cout<<"Guess the secret num between 1-10 + 3 : ";
cin>>a;
else if(a>secret)
{
cout<<"Secret num is smaller!!"<<endl;
}
else if(a<secret) {
cout<<"Secret num is greater !!"<<endl;
}
}
while(a!=secret)
cout<<" "<<endl;
cout<<""<<endl;
cout<<"Congratulations!!!! This is the secret num...."<<secret<<endl;
Вам не нужно, но если вы все еще хотите решить проблему, вы можете выполнить потоковую передачу строки и получить ее только в числовом формате.
я хотел бы использовать
std::getline
а такжеstd::string
читать всю строку
а затем только вырваться из цикла, когда вы можете преобразовать весь
линия к двойному.#include <string> #include <sstream> int main() { std::string line; double d; while (std::getline(std::cin, line)) { std::stringstream ss(line); if (ss >> d) { if (ss.eof()) { // Success break; } } std::cout << "Error!" << std::endl; } std::cout << "Finally: " << d << std::endl; }
В вашем случае, поскольку 0 находится вне допустимого диапазона, это действительно просто:
a
до 0 и если a
0 после извлечения:clear
cin
ignore
cin
(Будьте осторожны, чтобы указать, что вы хотите игнорировать вплоть до символа новой строки: Не могу cin.ignore до EOF?)Ваш окончательный код должен выглядеть примерно так:
cout << "Guess the secret num between 1-10 + 3 : ";
cin >> a;
while (a != secret) {
if (a == 0) {
cin.clear();
cin.ignore(std::numeric_limits<streamsize>::max(), '\n');
cout << "Please enter a valid number between 1-10 + 3 : ";
}
else if (a < secret) {
cout << "Secret num is smaller!!\nGuess the secret num between 1-10 + 3 : ";
}
else if (a < secret) {
cout << "Secret num is greater !!\nGuess the secret num between 1-10 + 3 : ";
}
a = 0;
cin >> a;
}