Member 12919791 Ответов: 2

Ошибка кода C: я не уверен, почему я получаю эту ошибку


В этих строках кода я хочу найти "длину" номера кредитной карты, "NUM". Я не могу понять, почему я получаю эту ошибку.

Вход и выход:

Введите число: `123456789 повторов: 12345678912 (/дома/Убунту/рабочее место/pset1/кредит+0x42bf01): Ошибка времени выполнения: значение 1е+11 находится вне диапазона представимых значений типа 'int' (/дома/Убунту/рабочее место/pset1/кредит+0x42bf01): Ошибка времени выполнения: значение 1е+10 вне диапазона представимых значений типа 'int' недействительным

~/рабочее место/pset1/ $ ./кредит введите номер: 123456789123456 (/дома/Убунту/рабочее место/pset1/кредит+0x42bf01): Ошибка времени выполнения: значение 1е+11 находится вне диапазона представимых значений типа 'int' (/дома/Убунту/рабочее место/pset1/кредит+0x42bf01): Ошибка времени выполнения: значение 1е+13 находится вне диапазона представимых значений типа 'int' (/дома/Убунту/рабочее место/pset1/кредит+0x42bf01): ошибки во время выполнения: значения 1e+15 выходят за пределы диапазона представимых значений для типа 'int'

(/дома/Убунту/рабочее место/pset1/кредит+0x42bf01): Ошибка времени выполнения: значение 1е+10 вне диапазона представимых значений типа 'int' (/дома/Убунту/рабочее место/pset1/кредит+0x42bf01): Ошибка времени выполнения: значение 1е+12 выходит за пределы диапазона представимых значений типа 'int' (/дома/Убунту/рабочее место/pset1/кредит+0x42bf01): ошибки во время выполнения: значение 1е+14 находится вне диапазона представимых значений для типа 'int' недействительным

Что я уже пробовал:

Вот мой код:

/*PROMPT USER FOR NUMBER*/
 printf("Enter number: \n");

 /*STORE NUMBER AS A LONG NUMBER*/
 long NUM = GetLongLong();

 /*VARIABLES FOR WHILE LOOP*/
 long long range1 = 9;
 long long length = 1;

 /*FIND NUM'S LENGTH*/
 while
 (NUM > range1)

 {
    range1 = range1 * 10LL + 9;
    length += 1;
 }

2 Ответов

Рейтинг:
2

Richard MacCutchan

Не делайте этого так; номер кредитной карты-это не единственная ценность. Считайте цифры как строку, а затем все, что вам нужно сделать, это получить количество цифр в строке.


Рейтинг:
0

Jochen Arndt

Код выглядит в основном нормально.

Предполагая, что GetLongLong() возвращает long long, ошибка может возникнуть, когда входной сигнал больше, чем LONG_MAX (2147483647) при преобразовании в long Однако в этой строке должно быть предупреждение компилятора, поскольку приведение не используется.

Если это так, то это можно решить с помощью long long и для Нума тоже.
Примечание: не используйте все имена переменных в верхнем регистре с C/C++. Они обычно используются только с #defineс.

Ошибка также может возникнуть в GetLongLong() функция, для которой вы не показали код.

[РЕДАКТИРОВАТЬ]
Ответ на комментарий

Цитата:
Я попытался добавить long long для NUM, но это не помогло. GetLongLong () должен быть встроенной функцией.

GetLongLong() это не стандартная библиотечная функция. Я нашел это ([^]):
/*
 * Reads a line of text from standard input and returns an equivalent
 * long long in the range [-2^63 + 1, 2^63 - 2], if possible; if text
 * does not represent such a long long, user is prompted to retry.
 * Leading and trailing whitespace is ignored.  For simplicity, overflow
 * is not detected.  If line can't be read, returns LLONG_MAX.
 */

long long
GetLongLong(void)
{
    // try to get a long long from user
    while (true)
    {
        // get line of text, returning LLONG_MAX on failure
        string line = GetString();
        if (line == NULL)
            return LLONG_MAX;

        // return a long long if only a long long (possibly with
        // leading and/or trailing whitespace) was provided
        long long n; char c;
        if (sscanf(line, " %lld %c", &n, &c) == 1)
        {
            free(line);
            return n;
        }
        else
        {
            free(line);
            printf("Retry: ");
        }
    }
}

Это объясняет, почему в выходных данных печатается "Retry". Все, что я могу сейчас предположить, это то, что sscanf реализация используемой библиотеки не позволяет сканировать 64-битные целые числа.

Однако вход "123456789" должен работать, потому что он меньше, чем LONG_MAX.

Вы можете попробовать использовать strtoll-ссылка на C++ [^] вместо:
long long GetLongLong()
{
    char *endptr;
    string line = GetString();
    long long num = strtoll(line, &endptr, 10);
    // Conversion stops at first char that is not a digit.
    // May inspect *endptr to detect this.
    // Zero if not a number.
    // LLONG_MAX or LLONG_MIN if out of range (errno is set to ERANGE).
    free(line);
    return num;
}
[/РЕДАКТИРОВАТЬ]


Member 12919791

Я попытался добавить long long для NUM, но это не помогло. GetLongLong () должен быть встроенной функцией. Спасибо,