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



我正在尝试使用 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] == '')
{
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] == '')

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

char arr[20][50]={0};
  • 循环是从0MAX_STUDENTS。如果数组索引大于或等于 50,则正在调用一个未定义的行为,该行为在数组索引上超出界限循环MAX_STUDENTS。MAX_COURSES也是如此。更清楚地循环将是for (set = 0; set < (50); set++).

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

  • 看到你的使用courses很明显你想像这样声明它

    char courses[5][20];
    

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

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

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

最新更新