На ум приходят два метода.
Первый полезен, если вы знаете, что ввод является целочисленным, но страдает от «слегка» превышения целочисленного диапазона:
long x;
if (1 != scanf("%ld", &x))
error "not a number or other i/o error"
else
if (x < -MAXINT || x > MAXINT)
error "exceeds integer range"
else printf "it is an integer";
Это во многом зависит от компилятора и платформы. Обратите внимание, что язык C гарантирует только то, что long
больше или равно размеру int
. Если это выполняется на платформе, где long
и int
имеют одинаковый размер, это бесполезный подход.
Второй подход заключается в чтении ввода в виде строки и прямом анализе:
char buf [1000];
if (1 != scanf ("%1000s", buf))
error "i/o error";
size_t len = strspn (buf, "0123456789+-");
if (len != strlen (buf))
error "contains invalid characters";
long number = 0;
int sign = 1;
for (char *bp = buf; *bp; ++bp)
{
if (*bp == '-')
{
sign = -sign;
continue;
}
if (*bp == '+')
continue;
number = number * 10 + *bp - '0';
if (number > MAXINT)
error "number too large";
}
if (sign < 0)
number = -number;
Этот код имеет несколько недостатков: он зависит от того, long
больше, чем int
; это позволяет плюсу и минусу появляться в любом месте строки. Его можно легко расширить, чтобы разрешить использование чисел, отличных от десятичных.
Возможный третий подход может состоять в том, чтобы ввести строку для проверки набора символов и использовать преобразование double
для проверки диапазона.
person
wallyk
schedule
23.03.2014