Функция Strtol возвращает неправильное значение - PullRequest
0 голосов
/ 02 августа 2020

Мне нужно получить номер кредитной карты в качестве входных данных для упражнения, поэтому я использую функцию fgets (получаю ее как строку, чтобы проверить, действительно ли это число), а затем strtol, чтобы сделать ее длинным целое число. Но целочисленное значение, возвращаемое функцией, не соответствует значению в строке.

while (*endptr != '\n') {
        char card_number_string[20];
        char *endptr;
        long int card_number;

        printf("Number: ");
        fgets(card_number_string, 20, stdin);
        card_number = strtol(card_number_string, &endptr, 10);
        printf("Result: %ld", card_number);
    }

Например, когда я ввожу значение 4003600000000014, вывод strtol, показанный в printf, будет 2147483647.

Это ошибка в моем коде? Или функция возвращает что-то другое, например:

Примечание: все переменные объявлены поверх основной функции, они находятся там, чтобы знать, как они были объявлены

1 Ответ

2 голосов
/ 02 августа 2020

Значение вне диапазона long. 2147483647 - максимальное значение long в вашем случае.

Используйте long long. (или unsigned long long в случае отрицательного значения CC# не нужны)

    //long int card_number;
    long long card_number;

    printf("Number: ");
    fgets(card_number_string, 20, stdin);
    
    //card_number = strtol(card_number_string, &endptr, 10);
    card_number = strtoll(card_number_string, &endptr, 10);

    //printf("Result: %ld", card_number);
    printf("Result: %lld", card_number);

Примечание: char *endptr; затеняет endptr в while (*endptr != '\n')

...