【问题标题】:Defining a character array in header file in C++在 C++ 的头文件中定义字符数组
【发布时间】:2018-09-22 00:23:50
【问题描述】:

我正在做一个在游戏窗口中显示问题的项目。

由于这个问题需要进行大量更改,我认为每次问题更改时只需编辑 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";

但它返回错误"qLine" in "question", which is of non-class type "tagQuestion[1]"

charconst char* 我都试过了,都没有成功。

我试图按照教科书中的一个例子,但我认为我误解了它。

一旦我在头文件中声明了字符数组,我不能在主文件中编辑它的内容吗?

【问题讨论】:

  • 该代码中存在多个问题。第一个问题:question 是一个只有一个元素的数组,所以你需要使用question[0].qline 来访问question[0] 包含的名为qline 的数组。其他问题将随之而来。投票结束,因为问题不够具体,任何人都可以真正提供帮助。您需要通读有关 C++ 的基本文本,而不是依靠猜测和编写具有多个不相关但相互关联的问题的代码..
  • Alex,我认为自 1990 年代以来我没有使用 char[] 来存储字符串。 . .您的教科书是否建议这是处理字符串的正确方法?
  • @Ves ,我的课已经过时了 12 年。

标签: c++ arrays char header-files


【解决方案1】:
  1. [1]question 之后似乎没有任何意义。删除它。

  2. 您的答案是 char 数组,但您的问题是 char 指针数组。我很确定您不希望您的问题包含 150 个字符指针。

  3. 如果你想改qLine,不要改成const

  4. qLine[150] = ... 这会将值分配给具有 150 个元素的数组的第 151 个元素。既不是你想要的,也不是法律代码。您可能想要qLine =,但这不适用于数组,而是需要使用像strcpy 这样的函数将数据写入数组,但我强烈建议不要这样做。 (见下一点)

  5. 不要在 C++ 中使用 C。使用std::string,而不是char 的数组。

  6. 如果您有经常更改的字符串,请创建一个文件来存储您的字符串,将它们加载到映射中,然后随时随地从映射中提取它们,而不是将硬编码的字符串放入您的代码中.这样,您在更改文本时无需更改任何代码。

我建议是这样的:

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 成为一个隐藏其内部结构并具有访问器方法和构造函数或静态方法的类,以通过正确的错误处理从有效行创建新实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 2022-12-21
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    相关资源
    最近更新 更多