我正在做一个在游戏窗口中显示问题的项目。
由于这个问题需要进行大量更改,我认为定义 5 行文本(1 行用于问题,4 行用于 MC 答案)会更容易,每次问题更改时都进行简单的编辑。
我已经在头文件中试过了:
struct tagQuestion{
int x, y;
const char* qLine[150];
char ansA[150];
char ansB[150];
char ansC[150];
char ansD[150];
}question[1];
然后在我的 main.cpp 中
question.qLine[150] = "TEST PHRASE";
但它在“question”中返回错误“qLine”,它是非类类型“tagQuestion[1]”
我试过 char
和 const char*
都没有成功。
我正在尝试按照教科书中的示例进行操作,但我认为我误解了它。
一旦我在头文件中声明了字符数组,我就不能在主文件中编辑它的内容吗?
最佳答案
question
之后的[1]
似乎没有任何意义。将其删除。您的答案是字符数组,但您的问题是字符指针数组。我很确定您不希望您的问题包含 150 个字符指针。
如果你想改变
qLine
,不要让它成为const
。qLine[150] = ...
这会将值分配给具有 150 个元素的数组的第 151 个元素。既不是你想要的,也不是合法的代码。您可能需要qLine =
,但这不适用于数组,您需要使用类似strcpy
的函数将数据写入数组,但我强烈建议反对那个。 (见下一点)不要在 C++ 中使用 C。使用
std::string
,而不是char
的数组。如果您有定期更改的字符串,请创建一个存储字符串的文件,将它们加载到 map 中,然后随时随地从 map 中提取它们,而不是将硬编码的字符串放入您的代码中.这样,当您更改文本时,您无需更改任何代码。
我建议这样:
struct Question {
std::string text;
std::vector<std::string> answers;
};
std::map<std::string, Question> questions;
然后是这样的:
ifstream questionsFile("questions.txt");
if (questionsFile.is_open())
{
std::string line;
while (std::getline(questionsFile, line))
{
// Split line into some id, text and answers, how exactly depends on the format you chose
std::string id = ...;
Question question;
question.text = ...;
question.answers.push_back(...);
questions[id] = question;
}
questionsFile.close();
}
else
{
// Handle error
}
在你的代码中的任何地方:
// Print question with id "q1":
std::cout << questions["q1"].text << std::endl;
// Print answer #2 for question with id "q1":
std::cout << questions["q1"].answers[1] << std::endl;
更好的方法是使 Question
成为一个隐藏其内部结构并具有访问器方法和构造函数或静态方法的类,以通过适当的错误处理从有效行创建新实例。
关于c++ - C++头文件中定义字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52452429/