Почему strtol () возвращает -1 для очень больших чисел в C?
Код работает неправильно из-за неправильной комбинации спецификатора печати / переменной.То есть неопределенное поведение .
long long i = .... printf("i = %d\n", i);
должно выдавать предупреждение с компиляцией с включенным предупреждением о скважине.Экономьте время и включите все предупреждения.
Используйте соответствующий спецификатор / переменную печати: @ Джонатан Леффлер @ Ian Abbott
long long i = ....
...
// vvv
printf("i = %lld\n", i);
Было бы более разумно использовать strtoll()
для преобразования строки в long long
int main() {
// long long i = strtol("1358...
long long i = strtoll("135898539853985649864867468746876587784760", NULL, 10);
// printf("i = %d\n", i);
printf("i = %lld\n", i);
return 0;
}
Печать значения errno
будет указывать на переполнение.Тестирование endptr
покажет, произошло ли какое-то преобразование.
Поскольку strtoll()
может установить errno
в ненулевое значение, установить в 0 непосредственно перед вызовом функции, чтобы хорошо оценить эффект функции послеи код не унаследовал некоторое ранее ненулевое значение.
char *endptr;
errno = 0;
long long i = strtoll(some_string, &endptr, 10);
int errnum = errno;
printf("i = %lld\n", i);
if (some_string == endptr) {
puts("No conversion");
} else {
if (errnum == ERANGE) {
puts("Overflow");
} else if (errnum) {
puts("Implementation specific error");
}
}