Вы можете использовать strtol
для этого.Сначала вам нужно проверить, если эта функция не преобразует значение.Если преобразование выполнено успешно, проверьте, находится ли значение в диапазоне от INT_MIN
до INT_MAX
:
errno = 0;
long x = strtol(argv[1], NULL, 10);
if (errno) {
perror("conversion failed");
} else if (x < INT_MIN) {
printf("value too small\n");
} else if (x > INT_MAX) {
printf("value too big\n");
} else {
printf("value = %ld\n", x);
}
Обратите внимание, что это будет работать, если long
имеет такой же размер, как int
илибольше.
Если sizeof(long) > sizeof(int)
, проверки INT_MIN
и INT_MAX
будут обнаруживать случаи, когда значение соответствует long
, но не int
.Если sizeof(long) == sizeof(int)
, значение вне диапазона приведет к тому, что для errno
будет установлено значение, отличное от нуля, чтобы поймать ошибку, а случаи INT_MIN
и INT_MAX
никогда не будут истинными.