我正在尝试比较我的数组元素,但是当我编译它时,类成员数组没有显示我从main“key”中的原始数组复制到数组中的值, 但是来自main的数组“answer”保留了我输入的值,并且在程序运行后我编写了一个测试循环,只是为了查看类成员数组“canswers”里面的内容,它是我复制到的实际变量主“key”中的数组。我试图在类功能“等级”中比较两个数组(“canswers”和“answer”),但我不知道我做错了什么。每次我通过for循环比较它们, if语句,它不起作用,并出现随机字符。我在数组的最后写了一个测试循环,以显示类成员数组“canswers”的内容,它具有我从main复制的所有正确的值,但是当我比较时它没有显示或工作二。我尽量保持代码尽可能干净,这样你们就可以轻松阅读它了。
#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;
}
答案 0 :(得分:1)
您的canswers
会员不是有效声明。它可能使用编译器提供的扩展来支持C 灵活数组成员。这将像0
大小的数组一样,您对canswers
变量的访问因此读取和写入超出对象边界,重新处理未定义的行为。
您应该使用正确的数组大小声明canswers
,或者允许它为vector<char>
或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
而未通过调用canswers
初始化setKey()
。
test2.setKey(key);
test2.grade(answer); // comparing the values of canswer[] and answer[]
答案 1 :(得分:1)
您永远不会为test2设置密钥。这意味着 test2 中的canswers
数组未初始化,您只在test1中执行过。当c ++中的变量未在c ++中初始化时,它包含随机值,如您所发现的那样。您想将test2.grade(answer)
更改为test1.grade(answer)
,它应该可以正常工作。
如果您希望答案密钥在所有测试中都相同,那么请将canswers设为静态:
static char canswers[]