1

C++ を使用して最初の 12 桁を使用して、13 桁の ISBN の最後の桁を計算しようとしています。コードは正しいはずですが、使用している式が間違っている可能性があると感じています。

式は次のとおりです。

10 - (d0 + d1 * 3 + d2 + d3 * 3 + d4 + d5 * 3 + d6 + d7 * 3 + d8 + d9 * 3 + d10 + d11 * 3) % 10

ここに私が持っているものがあります:

#include <cstring>
#include <iostream>

int main() {
    int weightedSum = 0;
    int checksum = 0;
    int i;      //for loop decrement
    int mul = 3;
    const int LENGTH = 12;
    char ISBNinput[LENGTH];

    std::cout << "Enter first 12 digits of ISBN: ";   //ask user for input
    std::cin >> ISBNinput;       //stores input into ISBNinput
    std::cout << std::endl;

    for (i = 0;  i < strlen(ISBNinput);  i++) {

        weightedSum += (ISBNinput[i] % 12) * mul;

        if (mul == 3) {
            mul = 1;
        } else {
            mul = 3;
        }

    }//close for loop

    checksum = weightedSum % 10;        //calculates checksum from weightedSum

    std::cout << checksum << std::endl;       //prints checksum with new line for format

    return 0;
}

例えば:

978007063546 は 3 を返す必要があります

978032133487 は 9 を返す必要があります

助けてくれてありがとう。

4

2 に答える 2

1

コードには明らかなバグが 1 つあります。 for に十分なスペースを割り当てていませんISBNinput。1 文字長くする必要があります。

const int LENGTH = 13;

これは、文字配列文字列が余分なヌル文字で終了しているためです。運が良ければ、メモリ内の次のバイトが NULL バイトになることがあります。その場合でも、プログラムが動作することがあります。

valgrind または同様のメモリ チェッカーを使用してプログラムを実行すると、プログラムがスタックに割り当てられたメモリを超えてアクセスするため、エラーが発生する可能性があります。

また、別のバグがあると思います。mulに初期化する必要があると思います1

ところで、このコードは非常に壊れやすく、入力する文字数は 12 文字以下であり、すべて数字であると見なされます。概念実証のための簡単なハックとしては問題ないかもしれませんが、実際のプログラムでは使用しないでください。

于 2015-12-01T05:53:45.963 に答える