0

配列要素を比較しようとしていますが、コンパイルすると、クラスメンバー配列には、メインの「キー」の元の配列から配列にコピーした値が表示されませんが、メインの「回答」の配列は保持されます入力した値と、プログラムの実行後にテストループを書き、クラスメンバー配列「canswers」の内容を確認しました。これは、メインの「キー」から配列にコピーした実際の変数です。クラス関数「grade」で 2 つの配列 (「canswers」と「answer」) を比較しようとしていますが、何が間違っているのかわかりません。 if 文では動作せず、ランダムな文字が表示されます。クラスメンバー配列「canswers」の内容を表示するために、配列の最後にテストループを書きました。これには、メインからコピーした正しい値がすべて含まれていますが、比較すると表示も機能もしません2。皆さんが簡単に読めるように、コードをできるだけきれいに保つようにしました。

#include<iostream>
#include<string>

using namespace std;

class TestGrade
{   
    public: 
        void setKey(char []);
        void grade(char []);
        char canswers[];
        void display();
}; 


void TestGrade::setKey(char answers[]) //setting values from "key" array in main
{
    for(int index = 0; index < 19; index++)
    {
        canswers[index] = answers[index]; 
    }
}

void TestGrade::grade(char answer[])  //comparing elements in array, here's where the 
{                                     //trouble begins
    for(int index = 0; index < 19; index++)
    {
        cout << canswers[index] << " " << answer[index] << endl; 
        if(canswers[index] == answer[index])
            { cout << "The values are equal" << endl;}
    }
}

void TestGrade::display()       //testing the values after the loop i had trouble with
{
    for(int index = 0; index < 19;index++)
    {
        cout << canswers[index] << endl;
    }
}


int main()
{
    const char SIZE = 20;
    char answer[SIZE];
    char key[20] = {'B', 'D', 'A', 'A',
                    'C', 'A', 'B', 'A',
                    'C', 'D', 'B', 'C',
                    'D', 'A', 'D', 'C',
                    'C', 'B', 'D', 'A'};

    TestGrade test1,test2;

    test1.setKey(key);

    cout << "Welcome to the written portion of the DMV exam. \n";
    cout << "You may only enter capital A, B, C, or D for your answers.\n\n" << endl;

    for (int index = 0; index < SIZE; index++)
    {
        cout << "Enter your answer for question " << index+1 << endl;
        cin >> answer[index];

        while (answer[index] != 'A'
            && answer[index] != 'B'
            && answer[index] != 'C'
            && answer[index] != 'D')
        {
            cout << "ERROR: you must input capital A,B,C, or D" << endl;
            cin >> answer[index];
        }
    }

    test2.grade(answer); // comparing the values of canswer[] and answer[]

    test1.display();  //test loop testing contents of canswers[] class member array

    system("pause");
    return 0;
}
4

2 に答える 2

1

あなたのcanswersメンバーは有効な宣言ではありません。Cフレキシブル配列メンバーをサポートするために、コンパイラが提供する拡張機能を使用している可能性があります。これは0サイズ指定された配列のように機能するため、canswers変数へのアクセスはオブジェクトの境界を超えて読み書きされ、未定義の動作が発生します。

canswers正しい配列サイズで宣言するか、代わりにvector<char>orにする必要があります。array<char, 20>の場合vector<char>:

class TestGrade
{
public:
    void setKey(char []);
    void grade(char []);
    std::vector<char> canswers;
    void display();
};

を使用する場合はvector<char>、実装方法を変更する必要がありますsetKey()

void TestGrade::setKey(char answers[]) //setting values from "key" array in main
{
    canswers.clear();
    canswers.insert(canswers.begin(), answers, answers+20);
}

あなたのmain()コードでは、呼び出しtest2で初期化せずに使用しています。canswerssetKey()

test2.setKey(key);
test2.grade(answer); // comparing the values of canswer[] and answer[]
于 2013-06-27T23:40:31.200 に答える
1

test2 のキーを設定することはありません。これは、 test2canswersの配列が初期化されていないことを意味します。test1 でのみ実行しました。あなたが発見したように、c++の変数がc++で初期化されていない場合、ランダムな値が含まれています。に変更したい場合は、正常に動作するはずです。test2.grade(answer)test1.grade(answer)

回答キーをすべてのテストで同じにしたい場合は、次のように canswers を静的にします。

static char canswers[]
于 2013-06-27T23:48:01.073 に答える