我正在尝试使用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;
}
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};
0
到MAX_STUDENTS
。如果MAX_STUDENTS大于或等于50,则调用在数组索引之外循环的未定义行为。对于MAX_COURSES
,也是如此。更明显的循环将是for (set = 0; set < (50); set++)
。courses
显然你想要这样声明它
char courses[5][20];
同样适用于grades
阵列。在这里,您尝试将字符串复制到二维数组中。编译器会抱怨类型不兼容。
dynGrades
和dynCourses
的内容复制到数组中。所以他们都将包含相同的值。这是你想要的吗?因为那么保留5个单独的char数组有什么用 - 一个可以很好地服务于这个目的。