在C ++

时间:2016-04-18 22:10:37

标签: c++ arrays struct char

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

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

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

索引0将是荷兰语中的单词,索引1将是荷兰语中的单词,等等。我将使用函数随机选择0和外语词长度之间的数字,将其打印在屏幕上,等等很简单。

我以为我可以简单地创建一个结构数组并将char数组strcopy到struct数组中。

    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数组元素进行硬编码的char数组数组的正确方法是什么?

5 个答案:

答案 0 :(得分:2)

您的代码语法很糟糕。您必须将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"这样的char数组有额外的char,称为null terminate '\0',所以你必须定义足够大的数组来存储你的字符和额外的字符。这个概念被称为' null终止字符串'

'\0'strcpy等函数中正确定义字符串大小需要

strlen个字符。吨。 C。因为你只能通过指向第一个元素的指针来了解数组大小(所有数组文字都被认为是C / C ++中的指针)。

答案 1 :(得分:1)

在C ++中,单引号和双引号之间存在区别:单引号表示单个字符文字,例如' a',' 0',' \ n'而双引号用于c字符串,例如" a.u.b"

所以替换

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

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

答案 2 :(得分:1)

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

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似乎不适合你。可怜。尽可能使用它。它会为你省去很多麻烦。

答案 3 :(得分:0)

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

#include <string>
#include <array>

struct numbers
{
  std::string numberWord;
};

int main()
{
  numbers numberChoices[] = {
        { "een" },
        { "twee" },
        { "drie" },
        { "vier" },
        { "vijf" },
        { "zes" },
        // ... etc
   };
}

答案 4 :(得分:0)

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

你不应该使用任何魔法索引!改为使用地图,使用有意义的键;

使用正确的地图和字符串用法,您的代码可能与此示例类似:

#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