strtol ведет себя не так, как ожидалось, c - PullRequest
0 голосов
/ 29 октября 2011
#include<limits.h>
#include<errno.h>

long output;

errno = 0;
output = strtol(input,NULL,10);
printf("long max = %ld\n",LONG_MAX);
printf("input = %s\n",input);
printf("output = %ld\n",output);
printf("direct call = %ld\n",strtol(input,NULL,10));
if(errno || output >= INT_MAX || output <= INT_MIN) {
    printf("Input was out of range of int, INT_MIN = %d, INT_MAX = %d\n",INT_MIN,INT_MAX);
    printf("Please input an integer within the allowed range:\n");
}

, когда приведенный выше код снабжается входным массивом {'1', '2', '3', '4', '5', '6', '7', '8', '9' , '0', '1'}

я получаю вывод:

long max = 9223372036854775807
input = 12345678901
output = -539222987
direct call = 3755744309

что происходит ... strtol, похоже, страдает от переполнения, но не устанавливает errno

1 Ответ

6 голосов
/ 29 октября 2011

Скорее всего, вы не включаете требуемые <stdio.h> и / или <stdlib.h> заголовки.

Ваш код работает нормально (GCC в 64-битном режиме), если вы включите их:

$ cat t.c
#include<limits.h>
#include<errno.h>
#include<stdlib.h>
#include<stdio.h>

int main (void)
{
    long output;
    char input[] = "12345678901";
    errno = 0;
    output = strtol(input,NULL,10);
    printf("long max = %ld\n",LONG_MAX);
    printf("input = %s\n",input);
    printf("output = %ld\n",output);
    printf("direct call = %ld\n",strtol(input,NULL,10));
    if(errno || output >= INT_MAX || output <= INT_MIN) {
        printf("Input was out of range of int, INT_MIN = %d, INT_MAX = %d\n",INT_MIN,INT_MAX);
        printf("Please input an integer within the allowed range:\n");
    }
    return 0;
}

$ gcc -Wall -Wextra -pedantic t.c
$ ./a.out
long max = 9223372036854775807
input = 12345678901
output = 12345678901
direct call = 12345678901
Input was out of range of int, INT_MIN = -2147483648, INT_MAX = 2147483647
Please input an integer within the allowed range:

Кстати, вы должны сохранять errno сразу после вызова strtol, библиотечные функции, которые вы вызываете между strtol и вашим условным выражением, могут изменить его значение.

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