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

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

9
задан Yu Hao 31 December 2013 в 06:57
поделиться

2 ответа

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

В случае успеха, [scanf] возвращает количество успешно прочитанных пунктов. Данный сайт подсчёт может совпадать с ожидаемым количеством показания или меньше, даже ноль, если случается сбой при совпадении. В случае сбой на входе перед любыми данными можно успешно прочитать, 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.

.
9
ответ дан 4 December 2019 в 13:47
поделиться

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

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

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

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

Также, держитесь подальше от функций из группы scanf до perfrom stringing-to-integer conversion (преобразование из строки в строку). Эти функции приводят к неопределенному поведению при переполнении (т.е. если входное представление строки слишком длинное). В общем случае, единственный правильный способ сделать такое преобразование в Си - это функции из группы strto... strto...

.
6
ответ дан 4 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: