2012-11-15 3 views
0

У меня есть код, который получает число от ввода, а затем помещает его в массив и затем печатает указанный массив. Но есть очень странный побочный эффект, когда я вводил 13-значное число, моя последняя цифра неверна. Если я укажу 15 или 16-значный номер, все будет в порядке. Я не понимаю, что происходит! Вот код: numberDigits - это 12, 14 или 15, в зависимости от количества цифр.C Array ведет себя по-разному с различным количеством цифр, почему?

int myNumber[numberDigits]; 
    for (int i = 0; i <= numberDigits; i++) 
    { 
     myNumber[numberDigits - i] = number % 10; 
     number = number/10;   
    } 
    printf("\n"); 

    for (int i = 0; i <= numberDigits; i++) 

    { 
     printf("%i",myNumber[i]); 
    } 

EDIT: Мой номер инициализируется как долгое долгое междунар. Вот чек, чтобы проверить количество цифр:

if (number/1000000000000 >= 1 && number/1000000000000 < 10) 
    { 
     numberDigits = 12; 
    } 
if (number/100000000000000 >= 1 && number/100000000000000 < 10) 
    { 
     numberDigits = 14; 
    } 
if (number/1000000000000000 >= 1 && number/1000000000000000 < 10) 
    { 
     numberDigits = 15; 
    } 

EDIT: Последнее обновление, Да, я обновил свой код и он работает, как ожидалось с вашими предложениями, но мне нужно, чтобы понять, почему мой код не работает , Я думаю, что, возможно, массив [12] фактически содержит 12 элементов, а не 13, и когда я получаю с ним доступ к массиву элементов [12], я получаю некоторое случайное значение из памяти, но почему этого не происходит с массивом [14] или массивом [15] с 15 и 16 номерами цифр соответственно. И почему программа не сбой, как и при доступе к массиву в неправильном положении. Исходный вопрос ниже со старым кодом, который не работает.

EDIT: Вот целая листинг для заинтересованных.

#include <stdio.h> 
#include <cs50.h> 

int verify (long long int number); 

int main(void) 

{ 
    printf("Please enter card number: \n"); 
    long long int number = GetLongLong(); 
    // AMEX uses 15 digits 
    if (number > 100000000000000 && ((number/10000000000000 == 34) || (number/10000000000000 == 37))) 
    {   

     printf("AMEX"); 

    } 

    if (number > 1000000000000 && number < 10000000000000 && (number/1000000000000 == 4)) 
    { 
     printf("VISA"); 
    } 

    if (number > 1000000000000000 && number < 9999999999999999 && (number/1000000000000000 == 4)) 
    { 
     printf("VISA"); 
    } 

     if (number > 1000000000000000 && number < 9999999999999999 && (number/100000000000000 == 51 || number/100000000000000 == 52 || number/100000000000000 == 53 || number/100000000000000 == 54 || number/100000000000000 == 55)) 
    { 
     printf("MASTERCARD"); 
    } 

    return verify(number); 
} 



int verify (long long int number) 
{ 
    int numberDigits; 
    if (number/1000000000000 >= 1 && number/1000000000000 < 10) 
     { 
      numberDigits = 12; 
     } 
    if (number/100000000000000 >= 1 && number/100000000000000 < 10) 
     { 
      numberDigits = 14; 
     } 
    if (number/1000000000000000 >= 1 && number/1000000000000000 < 10) 
     { 
      numberDigits = 15; 
     }  

    int myNumber[numberDigits]; 
    for (int i = 0; i <= numberDigits; i++) 
    { 
     myNumber[numberDigits - i] = number % 10; 
     number = number/10;   
    } 
    printf("\n"); 

    for (int i = 0; i <= numberDigits; i++) 

    { 
     printf("%i",myNumber[i]); 
    } 

    return 0; 
} 

ответ

2

Я думаю, что это должно быть что-то вроде этого:

for(int i = 0; i < numberDigits; ++i) printf("%d",myNumber[i]); 

вместо:

for(int i = 0; i <= numberDigits; ++i) printf("%i",myNumber[i]); 

И в первом цикле:

myNumber[numberDigits - (i + 1)] = number % 10; 

Кроме того, вы можете использовать что-то вроде это знать количество цифр:

int digits(long long num) { 
    if(!num) return 1; 
    return log10(num) + 1; 
} 
+0

Это работает, но что не так с моим кодом? Это в основном то же самое на всех уровнях. Почему изменяется число трейдинга, если, например, я ввожу 9837367482735, он дает мне 9837367482731, но если я вводим 15 или 16-значный номер, все будет правильно. – Dvole

+0

Я не знаю, что случилось, но, возможно, вы делаете что-то еще. Поместите весь код, чтобы увидеть, что может быть неправильным. – hinafu

+0

Введен полный код. – Dvole

3

Ваш for цикл должен выглядеть следующим образом:

for (int i = 0; i < numberDigits; i++) 

Поскольку индексы начинаются с нуля, последний будет numberDigits - 1. И вот <= прошел бы мимо конца.

+0

Если я делаю это так, мое первое число равно нулю и неверно. Поскольку для 13-значного числа я использую массив [12], моя последняя цифра остается 0. – Dvole

+0

Я вижу. Да, требуется немного больше работы. Но у меня проблемы с кодом. Где «номер» инициализируется с первого раза? –

+0

сделал, я получил 0xxxxxxxxxxx insted правильного номера и пропущен последнюю цифру. Как я уже сказал, он работает так, сначала равен нулю и т. Д., Заканчивается, когда числоDigits равно 12, а 12 - последнее в массиве, поэтому <= работает просто отлично, а проблема не в нем. – Dvole