C数组的行数不同,数字位数不同,为什么?

时间:2012-11-15 02:00:03

标签: c cs50

我有一个代码从输入中获取一个数字,然后将其放入数组,然后打印所述数组。但是有一个非常奇怪的副作用,当我输入13位数时,我的最后一个数字是错误的。如果我输入15或16位数字,一切都很好。我无法理解发生了什么!这是代码: numberDigits是12,14或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]);
    }

编辑: 我的号码被初始化为long long int。以下是检查位数的检查:

    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;
    }  
编辑:上次更新,是的,我已经更新了我的代码,它按预期的方式工作,但我需要了解为什么我的代码不起作用。我认为也许array [12]实际上包含12个元素而不是13个,当我用它访问元素数组[12]时,我从内存中得到一些随机值,但是为什么这不会发生在array [14]或数组中[15]分别有15和16位数字。并且当你在错误的位置访问数组时,为什么程序不会崩溃。以下原始问题,旧代码不起作用。

编辑:这是感兴趣的人的完整列表。

#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 个答案:

答案 0 :(得分:3)

您的for循环应如下所示:

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

由于索引从零开始,最后一个将是numberDigits - 1。所以<=将超越结束。

答案 1 :(得分: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;
}