【问题标题】:How to copy this struct with multiple arrays to another temporary struct?如何将此具有多个数组的结构复制到另一个临时结构?
【发布时间】:2020-12-06 03:50:01
【问题描述】:

我需要编写一个函数void findBoursiers(void),它需要执行以下任务:

  1. 复制struct student m_stuTab[STU_NB]的内容,其中包含6个学生 每一个

    a) 学生姓名 (name[MAX_NAME])

    b) 文件号 (fileNumber[NB_DIGITS])

    c) 得分。

我需要将所有这些复制到一个名为struct student temp_stuTab[STU_NB] 的临时结构(在void findBoursiers(void) 中创建)。

  1. 我需要取struct student temp_stuTab[STU_NB] 的内容,从最好到最差的顺序取最高分的3 个学生。我想象通过将它们与 for 循环进行比较。

  2. 将这 3 个学生放入一个名为 char m_boursiers[3][MAX_NAME] 的数组中。

我必须不要更改以下代码,它位于main()

struct student {
    char name[MAX_NAME];
    char fileNumber[NB_DIGITS];
    int score;
};

struct student m_stuTab[NB_STU];
char m_stuName[NB_STU][MAX_NAME] = {"Mario", "Yoshi", "Luigi", "Peach", "Wario", "Waluigi"};
char m_boursiers[3][MAX_NAME];

我知道这对于for 循环、strcpy 等是可行的,但我想知道是否有更有效的方法来做到这一点。也许类似于memcpy 的过程?如果我的问题难以理解,我对编码还很陌生。非常感谢!

【问题讨论】:

  • 你指的“类似于memcpy的过程”就是你想要的,我想。在 C++ 中,它通常用作std::memcpy
  • trivially copyable 的类和结构可以用旧的= 复制。 student 就像它们一样微不足道。
  • @user4581301 所以你说我只需要写student temp_stuTab = student m_stuTab ?因为当我尝试在函数中写这个时,它给了我一个错误,说未定义的标识符“学生”。这是我第一次使用 struct,所以对我来说不是很清楚
  • 只需student temp_stuTab = m_stuTab 复制一个 结构,或temp_stuTab[i] = m_stuTab[i](在循环中)按顺序复制数组的每个元素。但是memcpy 会一举搞定。
  • 嘿!谁偷走了 C++ 标签?该死!现在链接到 C++ 文档有点离题了。

标签: arrays c struct copy memcpy


【解决方案1】:
 student temp_stuTab = student m_stuTab

现在我明白了实际问题。 C 和 C++ 在这里有所不同,但无论如何这都是错误的。

C:

 struct student temp_stuTab;
 temp_stuTab = m_stuTab;

C++:

 student temp_stuTab;
 temp_stuTab = m_stuTab;

C++ 会以 C 的方式接受它,但这是不好的风格,除非你将结构命名为与变量相同的名称(由于不同的原因,这是不好的风格)。

【讨论】:

    【解决方案2】:

    要复制结构数组,请使用for 循环和简单的赋值:

    struct student m_stuTab[NB_STU];
    struct student temp_stuTab[NB_STU];
    
    for (size_t i = 0; i < NB_STU; i++) {
        temp_stuTab[i] = m_stuTab[i];
    }
    

    这是 C 和 C++ 的首选解决方案。如果你坚持使用memcpy,你可以这样写:

    memcpy(temp_stuTab, m_stuTab, sizeof(*temp_stuTab) * NB_STU);
    

    但它不会调用 C++ 中的复制构造函数或赋值重载函数,并且大小容易计算错误。好的编译器会尽可能为这两种方法生成相同的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多