2010-01-07 4 views
11

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

+1

Я верю, что этот вопрос отвечает на ваши вопросы. http://stackoverflow.com/questions/456303/how-to-validate-input-using-scanf – hometoast

+0

если целое число является числом? –

+2

Я прочитал вопрос как «если прочитанная строка является допустимым целым числом». – hometoast

ответ

8

http://www.cplusplus.com/reference/clibrary/cstdio/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 вместо этого.

+0

Спасибо, человек работает, но если я помещаю это в цикл, не работает должным образом, если вход является строкой в ​​начале, цикл бесконечен, я могу решить? – genesisxyz

+0

Я положил getchar(); внутри ... работает сейчас – genesisxyz

+1

'sscanf' и' scanf' - плохая идея. Оба производят неопределенное поведение при переполнении. – AnT

6

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

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

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

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

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

Смежные вопросы