Проверить, является ли значение из scanf числом? - PullRequest
10 голосов
/ 07 января 2010

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

Ответы [ 2 ]

9 голосов
/ 07 января 2010

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 .

6 голосов
/ 07 января 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...