0

入力から数値を取得し、それを配列に入れて、その配列を出力するコードがあります。しかし、非常に奇妙な副作用があります。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]);
    }

編集:私の番号はlonglongintとして初期化されます。桁数を確認するためのチェックは次のとおりです。

    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]は実際には13ではなく12の要素を保持していると思います。それを使用して要素array[12]にアクセスすると、メモリからランダムな値を取得しますが、array[14]またはarrayではこれが発生しないのはなぜですか。 [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;
}
4

2 に答える 2

3

ループforは次のようになります。

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

インデックスはゼロベースであるため、最後のインデックスはになりますnumberDigits - 1。そして<=、終わりを過ぎて行きます。

于 2012-11-15T02:01:37.330 に答える
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;
}
于 2012-11-15T02:02:38.370 に答える