我尝试使用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;
}
答案 0 :(得分: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 arr[20][50]={0};
初始化不包含字符串的字符数组。因此,请确保已在callee函数中初始化char数组,如此
0
循环从MAX_STUDENTS
到MAX_COURSES
。如果MAX_STUDENTS大于或等于50,则调用在数组索引之外循环的未定义行为。for (set = 0; set < (50); set++)
也是如此。更清楚的是循环将是courses
。
如果你把初始化和复制部分分开,那么再次处理它会有更好的方法。否则这将难以维持。
看到你的使用char courses[5][20];
很明显,你想宣布它是这样的
grades
dynGrades
数组。在这里,您尝试将字符串复制到二维数组中。编译器会抱怨类型不兼容。
同样在函数中,您没有返回任何有意义的内容。正确的方法是返回添加新名称或信息的索引值。
您正在将dynCourses
和nock.restore();
的内容复制到数组中。所以他们都将包含相同的值。这是你想要的吗?因为那么保留5个单独的字符串数组的用途 - 一个可以很好地达到目的。