【问题标题】:C - how to use strcpy for a 2 dimensional array?C - 如何将 strcpy 用于二维数组?
【发布时间】:2026-01-04 15:20:04
【问题描述】:

我正在尝试使用 str.cpy 构建一个二维数组,但程序失败。代码接收 4 个数组,将它们的内容复制到匹配的数组中。

  int InsertStudent(char *firstName, char* lastName, char* dynCourses, char *dynGrades,
        char firstNames[50][20],
        char familyNames[50][20], char courses[50][5][20],
        char grades[50][5])
    {
        int set, 
        int cset = 0;
        for (set = 0; set <= (50); set++)
        {
            if (firstNames[set][cset] == '\0')
            {
                strcpy(firstNames[set][cset], firstName);
                strcpy(familyNames[set], lastName);
                for (cset = 0; cset <= 5; cset++)
                {
                    strcpy(courses[set], dynCourses);
                    strcpy(grades[set], dynGrades);
                }

            }
        }
        return 0;
    }

【问题讨论】:

  • 你看过 struct 吗?这样你就可以让它更加面向对象
  • 你了解结构了吗?大概不会,因为您的参数列表需要一个结构类型的数组:struct Student { char firstName[20]; char familyName[20]; char courses[5][20]; char grades[5]; }; — 甚至是 struct Course { char name[20]; char grade; }; struct Student { char firstName[20]; char familyName[20]; struct Course courses[5] };
  • 名为:名字、姓氏、成绩和课程的数据数组都是本地的,在堆栈上,所以当数据“超出范围”时,任何将数据放入其中的操作都会消失它会在函数退出时。

标签: c arrays strcpy


【解决方案1】:
  • 显然错误是错误地使用了strcpy

    正确的方法是

    strcpy(firstNames[set], firstName);
    
  • 也应该在循环中

        for (cset = 0; cset < MAX_COURSES; cset++)
        {
            strcpy(courses[cset], dynCourses);
            strcpy(grades[cset], dynGrades);
        }
    

    请注意,惯用的 C 循环是 for (int i = 0; i &lt; MAX; i++),使用 &lt; 而不是 &lt;=

strcpy 函数的签名是

 char *strcpy(char * restrict s1, const char * restrict s2);

之前您通过一个字符代替s1 而不是char*。您一定收到了一些警告(如果启用)。如果没有,则打开所有编译器标志-Wall -Werror

             if (firstNames[set][cset] == '\0')

但是,如果您最初使用\0 检查未初始化的值。这极不可能被证明是错误的。不保证不包含字符串的 char 数组将自动使用0 初始化。因此,请确保您已像这样在被调用函数中初始化 char 数组

char arr[20][50]={0};
  • 循环是从0MAX_STUDENTS。如果 MAX_STUDENTS 大于或等于 50,则您正在调用未定义的行为循环超出范围的数组索引。MAX_COURSES 也是如此。更清楚的循环是for (set = 0; set &lt; (50); set++)

  • 同样,如果将初始化和复制部分分开,将会有很多更好的方法来处理它。否则这将难以维护。

  • 看到你用courses,很明显你想这样声明

    char courses[5][20];
    

grades 数组也是如此。在这里,您试图将字符串复制到二维数组中。编译器会抱怨类型不兼容。

  • 同样在函数中你没有返回任何有意义的东西。正确的方法是返回添加新名称或信息的索引值。

  • 在这里,您将 dynGradesdynCourses 的内容复制到数组中。所以它们都将包含相同的值。这是你想要的吗?因为那保留 5 个单独的 char 数组有什么用 - 一个可以很好地达到目的。

【讨论】:

  • 正确。这是一个函数,你是对的,我将返回值添加为学生的索引。
  • @CSstudent.: 学会使用struct,你会做出更干净的解决方案。
最近更新 更多