2016-11-03 15 views
2

Я хочу проверить, больше ли введенный пользователем номер или меньше указанных значений.Как проверить, что введенный пользователем номер не больше LLONG_MAX или LOWER, чем LLONG_MIN?

Я знаю о atoll function, но это, кажется, не особенно полезно, основываясь на неопределенном значении, не выглядит слишком убедительным.

Я также знаю, что я мог бы проверить, если строка пользователя вводится является всеми цифрами, в этом случае я мог проверить вещи, как если длина строки больше, чем длина LLONG_MAX или LLONG_MIN раз 0s на слева, или в случае, когда длина обоих одинакова, я мог бы проверять цифру цифрой, и если значение введенного числа в этой цифре больше, чем значение LLONG_MAX или LLONG_MIN, это было бы вне пределов досягаемости.

Но я думаю, что должен быть лучший способ сделать это. Надеюсь, вы можете дать мне советы о том, что это такое.

+0

вы можете вычесть значения из LLONG_MAX поразрядно, когда результат отрицательный, то у вас есть хит. все равно вам нужно быть осторожным, чтобы не переполнять его, вычитая одну цифру. – user3528438

ответ

5

Используйте вместо этого функцию strtoll.

В случае, если введенное значение выходит за пределы диапазона, errno установлен в ERANGE и либо LLONG_MIN или LLONG_MAX возвращается, в зависимости от того, недорасхода стоимости или переполнения.

От man page:

strtol() функция возвращает результат преобразования, если значение не будет Underflow или переполнения. Если происходит недополнение, strtol() возвращает LONG_MIN. Если происходит переполнение, strtol() возвращает LONG_MAX. В обоих случаях errno установлен в ERANGE. Точно то же самое относится к strtoll()LLONG_MIN и LLONG_MAX вместо LONG_MIN и LONG_MAX).

2

strtol. Per the strtol standard:

Если правильное значение находится вне диапазона представимых значений, {LONG_MIN}, {LONG_MAX}, {LLONG_MIN} или {LLONG_MAX} должны быть возвращаются (по знаку значения), и errno набор для [ERANGE] ,

Итак:

errno = 0; 
long long result = strtoll(inputStr, NULL, 0); 
if ((LLONG_MAX == result) && (ERANGE == errno)) 
{ 
    /* handle error */ 
    ... 
} 

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

  • Нет связанных вопросов^_^