Подтвердить что ты не робот

Проверьте, является ли значение из scanf числом?

Простейшим способом, как я могу проверить, является ли целое число, инициализированное функцией scanf, числом?

4b9b3361

Ответ 1

http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

При успешном завершении [scanf] возвращает количество элементов успешно прочитано. Эта count может соответствовать ожидаемому числу показаний или меньше, даже ноль, если происходит сбой соответствия. В случае входного отказа перед любыми данными может быть успешно прочитано, EOF вернулся.

Итак, вы можете сделать что-то вроде этого:

#include <stdio.h>

int main()
{
    int v;
    if (scanf("%d", &v) == 1) {
        printf("OK\n");
    } else {
        printf("Not an integer.\n");
    }
    return 0;
}

Но предполагается, что вы используете fgets и strtol вместо этого.

Ответ 2

Ваш вопрос странно сформулирован. Инициализированное целое число всегда является числом (помимо экзотических случаев ловушечных представлений), что означает, что нет необходимости ничего проверять.

Я бы предположил, что вам нужно проверить, является ли данная строка допустимым представлением числа. Для этого вам сначала нужно определить, как должно выглядеть действительное представление. Вы разрешаете знак? Разрешен ли избыточный + (как знак)? Что относительно префикса 0x для hexadecimals? И так далее.

Язык C предлагает свой собственный набор правил, которые определяют идею языка для корректного строкового представления целого. Если это необходимо, то для проверки того, соответствует ли данная строка этим правилам, наилучшим способом является использование функции преобразования строк в целое число, например strtol (и другие функции из группы strto...), а затем проверить условие ошибки.

Остерегайтесь ответов, которые предлагают написать свою собственную функцию, которая проверила бы эти правила. Это просто не имеет никакого смысла, поскольку стандартная функция уже существует. Кроме того, строго говоря, в реальном программировании редко требуется выполнить проверку без фактического преобразования. strto... будет делать оба.

Кроме того, избегайте функций от scanf group до perfrom преобразования строки в целое. Эти функции вызывают поведение undefined при переполнении (т.е. Если представление входной строки слишком велико). В общем случае единственный правильный способ сделать такое преобразование в C - это функции из группы strto....