Результат использования strtol () в stdlib.h и stdio.h отличается - PullRequest
0 голосов
/ 06 февраля 2019

При попытке разобрать число, слишком большое для длинного, strtol () возвращает 0 вместо LONG_MAX (stdio.h).Если я правильно прочитал спецификацию POSIX, это должно быть LONG_MAX.Существует разница между stdio.h и stdlib.h

#include "stdio.h"
int main(void){
    printf("%ld\n", strtol("99999999999999999999999"));
    return 0;
} # 0
#include "stdio.h"
//#include "stdlib.h"
int main(void){
    char *end[500];
    printf("%ld\n", strtol("99999999999999999999999", end, 10));
    return 0;
} # 9223372036854775807

1 Ответ

0 голосов
/ 07 февраля 2019

strtol объявляется в заголовке <stdlib.h> как

long strtol( const char *restrict str, char **restrict str_end, int base );
//                       ^^^^^^^^             ^^^^^^^^ since C99

В первом опубликованном фрагменте <stdlib.h> не включается, и функция вызывается с одним единственным аргументом, так что при компиляциис -Wall -Wextra -std=gnu11, gcc выдает следующие пояснительные предупреждения перед выводом 0:

prog.c: In function 'main':
prog.c:5:21: warning: implicit declaration of function 'strtol' [-Wimplicit-function-declaration]
     printf("%ld\n", strtol("99999999999999999999999"));
                     ^~~~~~
prog.c:5:15: warning: format '%ld' expects argument of type 'long int', but argument 2 has type 'int' [-Wformat=]
     printf("%ld\n", strtol("99999999999999999999999"));
             ~~^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
             %d

Это означает, что библиотечная функция вообще не вызывается и неявно объявленная функция с тем же именемвызывается, int со значением 0 возвращается и печатается (с неверным спецификатором формата, который сам по себе является неопределенным поведением).

Обратите внимание, что тот же код не компилируется с clang , который сообщает следующее:

prog.c:4:21: warning: implicitly declaring library function 'strtol' with type 'long (const char *, char **, int)' [-Wimplicit-function-declaration]
    printf("%ld\n", strtol("99999999999999999999999"));
                    ^
prog.c:4:21: note: include the header &ltstdlib.h&gt or explicitly provide a declaration for 'strtol'
prog.c:4:53: error: too few arguments to function call, expected 3, have 1
    printf("%ld\n", strtol("99999999999999999999999"));
                    ~~~~~~                          ^
1 warning and 1 error generated.

Во втором фрагменте, strtol вызывается с правильным количеством аргументов, но, как сообщается (с закомментированным #include), то же самое отсутствуетпроблема с заголовкомДля получения ожидаемого результата необходимо включить LONG_MAX, заголовок stdlib.h.

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