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

时间:2017-12-23 17:13:10

标签: c arrays 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] == '\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;
    }

1 个答案:

答案 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_STUDENTSMAX_COURSES。如果MAX_STUDENTS大于或等于50,则调用在数组索引之外循环的未定义行为。for (set = 0; set < (50); set++)也是如此。更清楚的是循环将是courses

  • 如果你把初始化和复制部分分开,那么再次处理它会有更好的方法。否则这将难以维持。

  • 看到你的使用char courses[5][20]; 很明显,你想宣布它是这样的

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

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

  • 您正在将dynCoursesnock.restore();的内容复制到数组中。所以他们都将包含相同的值。这是你想要的吗?因为那么保留5个单独的字符串数组的用途 - 一个可以很好地达到目的。