Использование C isdigit для проверки ошибок
При использовании логической проверки для внутреннего номера этот цикл не работает. Строки после этого остаются нераспознанными. Введите и целое число, как 60, и он просто закрывается. Я неправильно использовал isdigit?
int main()
{
int num;
int loop = -1;
while (loop ==-1)
{
cin >> num;
int ctemp = (num-32) * 5 / 9;
int ftemp = num*9/5 + 32;
if (!isdigit(num)) {
exit(0); // if user enters decimals or letters program closes
}
cout << num << "°F = " << ctemp << "°C" << endl;
cout << num << "°C = " << ftemp << "°F" << endl;
if (num == 1) {
cout << "this is a seperate condition";
} else {
continue; //must not end loop
}
loop = -1;
}
return 0;
}
3 ответа
Когда вы звоните isdigit(num)
, num
должен иметь значение ASCII символа (0..255 или EOF).
Если это определено как int num
затем cin >> num
поместит целое значение числа в нем, а не значение ASCII буквы.
Например:
int num;
char c;
cin >> num; // input is "0"
cin >> c; // input is "0"
затем isdigit(num)
ложно (потому что на месте 0 ASCII не цифра), но isdigit(c)
верно (потому что в месте 30 ASCII есть цифра '0').
isdigit
только проверяет, является ли указанный символ цифрой. Один символ, а не два и не целое число, как num
По-видимому, определяется как. Вы должны удалить эту проверку полностью, так как cin
уже обрабатывает проверку для вас.
Если вы пытаетесь защитить себя от недопустимого ввода (вне диапазона, не по номерам и т. Д.), Есть несколько моментов, о которых нужно беспокоиться:
// user types "foo" and then "bar" when prompted for input
int num;
std::cin >> num; // nothing is extracted from cin, because "foo" is not a number
std::string str;
std::cint >> str; // extracts "foo" -- not "bar", (the previous extraction failed)
Более подробно здесь: Игнорировать ввод пользователя за пределами того, что будет выбрано из