Как изменить этот код?
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>
enum { INPUT_SIZE = 30 };
int main () {
char *ptr;
long ret;
char str[INPUT_SIZE];
fgets(str, INPUT_SIZE, stdin);
ret = strtol(str, &ptr, 10);
if( ret == LONG_MAX || ret == LONG_MIN ) {
perror("!! Problem is -> ");
}
else if (ret) {
printf("The number is %ld\n", ret);
}
else {
printf("No number found input is -> %s\n", ptr);
}
return(0);
}
В случае успеха strtol()
возвращает преобразованное значение типа long int.
В случае неудачи,strtol()
возвращает 0
, если преобразование не может быть выполнено.Если правильное значение находится за пределами диапазона представимых значений, strtol()
возвращает LONG_MAX
или LONG_MIN
в соответствии со знаком значения.Если значение base не поддерживается, strtol()
возвращает 0
.
В случае неудачи strtol()
устанавливает для errno одно из следующих значений:
Коды ошибок:
EINVAL Значение базы не поддерживается.
ERANGE Преобразование вызвало переполнение.Источник: IBM
Можно ли проверить переполнение, например, с помощью scanf()
?
Input: 1234 stackoverflow
Output: The number is 1234
Input: 123nowhitespace
Output: The number is 123
Input: number is 123
Output: No number found input is -> number is 123
Input: between123between
Output: No number found input is -> between23between
Input: 9999999999999999999
Output: !! Problem is -> : Result too large
Может быть, не по теме, но, Джонатан Леффлер говорит в своих комментариях (в других темах), что обрабатывает предупреждения как ошибки.