【问题标题】:Assigning values to character arrays inside of a structure array in C++在 C++ 中为结构体数组内的字符数组赋值
【发布时间】:2016-04-18 22:10:37
【问题描述】:

我是 C++ 新手,但对 Python 非常熟悉。 Python 中的琐碎任务在 C++ 中似乎要复杂得多。我正在尝试制作一个简单的游戏,其中在屏幕上打印外语单词,用户猜测值,如果正确,他们将获得一分并继续猜测屏幕上打印的其他数字的值是什么。我面临的问题是,对于我正在学习的课程,我们不允许仅使用字符串字符数组。导师没有解释原因。

在 Python 中,我会为外来词创建一个字符串元组:

foreignWords = ('een', 'twee', 'drie'....) 

index 0 是荷兰语中的一个单词,index 1 是荷兰语中的两个单词,等等。我会使用一个函数来随机选择一个介于 0 和 foreignWords 长度之间的数字,将其打印在屏幕上,等等。做起来很简单。

我想我可以简单地创建一个结构数组并将字符数组复制到结构数组中。

    struct numbers
    {
      char numberWord[7];
    };


    int main()
    {
      numbers numberChoices[10];
      strcpy(numberChoices[0].numberWord, 'een');
      strcpy(numberChoices[1].numberWord, 'twee');
      strcpy(numberChoices[2].numberWord, 'drie');
      strcpy(numberChoices[3].numberWord, 'vier');
      strcpy(numberChoices[4].numberWord, 'vijf'):
      strcpy(numberChoices[5].numberWord, 'zes');

      etc.

但这不起作用。它产生一个错误:

    string.h:129:14: error:   initializing argument 2 of ‘char* strcpy(char*, const char*)’ [-fpermissive]
 extern char *strcpy (char *__restrict __dest, const char *__restrict __src)
              ^

但是,如果我创建一个 for 循环并通过 cin 输入 char 数组 >> 结构数组将存储我的条目并且可以通过索引调用它们。

基本上,我想做的是创建一个 char 数组的数组,这样我可以索引获取值并轻松跟踪单词的数值 (numberChoices[i].numberWord, i+1 = 打印字的数值)。我不知道这种方法是否合适,但我正在努力提高效率,因为结构数组将被引用很多来读取内存中存储的内容,将该值保存到新变量并操作引用的字符通过随机删除字符并让用户猜测打印的单词的值来排列数组。

在 char 数组元素被硬编码的情况下,制作 char 数组的正确方法是什么?

【问题讨论】:

  • 在 c++ 中,字符串用双引号括起来:"foo"。单引号仅用于字符。
  • 在 C++ 中,您将使用 std::vector 或 std::string。
  • 另外,单个char 是一个单个char,它只能容纳一个单个字符而不是一个字符串。
  • "我们不允许只使用字符串字符数组。"您的讲师明确禁止了 char const* numberchoices[] = { "een", "twie", "drie", "vier" }; 之类的内容,但是将 char 数组包装在结构中以某种方式可以吗?
  • 投票关闭,因为只是拼写错误(使用' 而不是")。

标签: c++ arrays struct char


【解决方案1】:

您的代码语法已磨损。您必须将 char 数组表示为 "abc",但不能像 'abc'。

所以你的代码必须是这样的:

  numbers numberChoices[10];
  strcpy(numberChoices[0].numberWord, "een");
  strcpy(numberChoices[1].numberWord, "twee");
  strcpy(numberChoices[2].numberWord, "drie");
  strcpy(numberChoices[3].numberWord, "vier");
  strcpy(numberChoices[4].numberWord, "vijf"):
  strcpy(numberChoices[5].numberWord, "zes");

其次,您必须记住,像"een" 这样的字符数组有额外的字符,称为空终止'\0',因此您必须定义具有足够大小的数组来存储您的字符和额外的字符。该概念称为'null 终止字符串'。

'\0' 字符需要在strcpy、strlen 等函数中正确定义字符串大小。吨。 C。因为您不能仅通过指向其第一个元素的指针来了解数组大小(所有数组文字都被视为 C/C++ 中的指针)。

【讨论】:

    【解决方案2】:

    在 C++ 中,单引号和双引号是有区别的:单引号表示单个 字符文字,例如'a', '0', '\n' 而双引号用于 c 字符串,例如“a.u.b”。

    所以替换

      strcpy(numberChoices[0].numberWord, 'een');
    

    与

      strcpy(numberChoices[0].numberWord, "een");
    

    【讨论】:

      【解决方案3】:

      除了其他人指出的引用混淆之外,您还可以利用静态初始化来消除其中的一些工作。

      struct numbers
      {
        char numberWord[7];
      };
      
      
      numbers numberChoices[10] =
      {
          {"een"},
          {"twee"},
          {"drie"},
          {"vier"},
          {"vijf"},
          {"zes"},
          ...
      };
      int main()
      {
          std::cout << numberChoices[1].numberWord << std::endl;
      }
      

      如果可能的话,在您的作业限制内,进一步简化:

      const char * numberChoices[] =
      {
          "een",
          "twee",
          "drie",
          "vier",
          "vijf",
          "zes",
          ...
      };
      int main()
      {
          std::cout << numberChoices[1] << std::endl;
      }
      

      看来std::string 不适合您。遗憾。尽可能使用它。它会为您省去很多麻烦。

      【讨论】:

        【解决方案4】:

        避免使用 c 风格的字符串。使用 c++ 概念:

        #include <string>
        #include <array>
        
        struct numbers
        {
          std::string numberWord;
        };
        
        int main()
        {
          numbers numberChoices[] = {
                { "een" },
                { "twee" },
                { "drie" },
                { "vier" },
                { "vijf" },
                { "zes" },
                // ... etc
           };
        }
        

        【讨论】:

          【解决方案5】:

          让我们暂时忽略你的课程要求;

          您不应该使用任何魔术索引!使用 map 代替,使用有意义的键;

          使用正确的映射和字符串,您的代码可能类似于此示例:

          #include <iostream>
          #include <vector>
          #include <string>
          #include <unordered_map>
          
          using foreign_word = std::string;
          using foreign_words = std::vector<foreign_word>;
          
          using language = std::string;
          using language_words_map = std::unordered_map<language, foreign_words>;
          
          int main() {
              language_words_map lwm = {
                  { "deutch", {"een", "twee", "drie"} },
                  /* ... and so on */
              };
              return 0;
          }
          

          见:http://ideone.com/BI6QjL

          【讨论】:

            猜你喜欢
            • 2019-10-30
            • 2021-02-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多