C - 如何将strcpy用于二维数组?

问题描述 投票:1回答:1

我正在尝试使用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;
    }
c arrays strcpy
1个回答
3
投票
  • 很明显错误是错误地使用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 < MAX; i++),使用<而不是<=

strcpy函数的签名是

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

早些时候你取代了s1而不是char*。你必须得到一些警告(如果启用)。如果没有,那么转动所有编译器标志-Wall -Werror

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

但是如果你最初使用\0检查未经授权的值。这种情况极不可能会变成虚假。没有保证不会自动使用0初始化不包含字符串的char数组。因此,请确保已在callee函数中初始化char数组,如下所示

char arr[20][50]={0};
  • 循环是从0MAX_STUDENTS。如果MAX_STUDENTS大于或等于50,则调用在数组索引之外循环的未定义行为。对于MAX_COURSES,也是如此。更明显的循环将是for (set = 0; set < (50); set++)
  • 如果你把初始化和复制部分分开,那么再次处理它会有更好的方法。否则这将难以维持。
  • 看到你使用courses显然你想要这样声明它 char courses[5][20];

同样适用于grades阵列。在这里,您尝试将字符串复制到二维数组中。编译器会抱怨类型不兼容。

  • 同样在函数中你没有返回任何有意义的东西。正确的方法是返回添加新名称或信息的索引值。
  • 在这里,您将dynGradesdynCourses的内容复制到数组中。所以他们都将包含相同的值。这是你想要的吗?因为那么保留5个单独的char数组有什么用 - 一个可以很好地服务于这个目的。
© www.soinside.com 2019 - 2024. All rights reserved.