Использование C isdigit для проверки ошибок - PullRequest
2 голосов
/ 30 июня 2011

При использовании логической проверки для внутреннего номера этот цикл не работает. Строки после этого остаются нераспознанными. Введите и целое число, как 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 ]

3 голосов
/ 30 июня 2011

isdigit только проверяет, является ли указанный символ цифрой.Один символ, а не два и не целое число, так как num представляется как.Вы должны полностью удалить эту проверку, поскольку cin уже обрабатывает проверку для вас.

http://www.cplusplus.com/reference/clibrary/cctype/isdigit/

3 голосов
/ 30 июня 2011

Когда вы вызываете 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').

2 голосов
/ 30 июня 2011

Если вы пытаетесь защитить себя от недопустимого ввода (вне диапазона, не по номерам и т. Д.), Есть несколько моментов, о которых нужно беспокоиться:

// 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)

Подробнее здесь: Игнорировать ввод пользователя за пределами того, что должно быть выбрано из

...