Почему strtol () возвращает -1 для очень больших чисел? - PullRequest
0 голосов
/ 25 июня 2018

Почему strtol () возвращает -1 для очень больших чисел в C?

Например:

#include <stdio.h>
#include <string.h>
int main() {
    long long i = strtoll("135898539853985649864867468746876587784760", NULL, 10);
    printf("i = %lld\n", i);
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Почему 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");
      } 
    }
0 голосов
/ 25 июня 2018

На самом деле, strtol() возвращает правильное значение LONG_MAX.Вы используете неверную строку формата - попробуйте printf("i = %lli\n", i);.%d предназначен для вывода обычного int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...