strtol () возвращает неверное значение - PullRequest
7 голосов
/ 31 марта 2011

У меня здесь странный вопрос.Все strtol, atol и atoi возвращают неверное значение, когда я передаю следующую строку:

long test = strtol("3087663490", &p, 10);

Согласно моему отладчику, он возвращает 2147483647. Я полностью озадачен этим.Любой совет?

Ответы [ 4 ]

12 голосов
/ 31 марта 2011

Ваше значение больше, чем может представлять тип long со знаком.Попробуйте:

unsigned long test = strtoul("3087663490", &p, 10);

(вы получаете 2147483647, так как это LONG_MAX или 0x7FFFFFFF)

9 голосов
/ 31 марта 2011

Правильно проверить ошибки от strtol() сложно.Вам нужен код, подобный приведенному ниже:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>

int main()
{
    char *n = "3087663490";
    char *p;
    long test;

    errno = 0;
    test = strtol(n, &p, 10);

    if (p == n)
        printf("No digits found.\n");
    else if ((test == LONG_MIN || test == LONG_MAX) && errno == ERANGE)
        printf("Value out of range.\n");
    else
        printf("Value is %ld\n", test);

    return 0;
}

Выполнение этого показывает, в чем ваша проблема - Value out of range..Используйте более широкий тип, например long longstrtoll()).

4 голосов
/ 31 марта 2011

Похоже, long - это 32-битный тип в вашей системе. Если это так, 3087663490 больше, чем LONG_MAX. Из справочной страницы strtol(3) :

Если происходит переполнение, strtol() возвращает LONG_MAX.

Вам необходимо использовать тип без знака для представления этого числа на вашем компьютере:

unsigned long test = strtoul("3087663490", &p, 10);

Должно работать нормально.

0 голосов
/ 31 марта 2011

После возвращения из strtol проверьте значение p.Я считаю, что если вы превысили ограничение размера, возвращаемое значение будет LONG_MAX и , указатель по-прежнему будет указателем на цифру, а не на пробел или текст.

И я также вижу после проверкичто errno будет установлено на ERANGE.

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