如何将2D Char数组传递给另一个函数?

时间:2018-01-31 00:00:59

标签: c arrays pointers multidimensional-array

我确定之前已经问过这个问题,但过去2天我一直在寻找并且无法解决这个问题,所以我希望有人会帮助我。

对于我的C赋值,我们应该接收每个函数参数作为指针。传递的值之一是2D char数组,在过去48小时内,我无法在我的书,笔记,教师幻灯片等中找到如何正确执行此操作,并实际使其工作。

我正在努力完成的简化代码

void main(){
/*
This is the value being passed. The first dimension has a size of 1000, 
to account for 1000 different sorted people. Second dimension is an 
array that holds the actual name, with a max name length of 25.
*/
    char names[1000][25] = {'\0'};
    read_files(names);
}
void read_files(char* names){
    char newName1[4] = "mary";
    char newName2[4] = "anna";
    for(int i = 0; i < 5; i++){
        names[0][i] = newName1[i];
    }
    for(int i = 0; i < 5; i++){
        names[1][i] = newName2[i];
    }
}

基本上,我试图让names[0][x]拥有x = "mary"names[1][x]拥有x = "anna"

(或者,更确切地说,names[0][0]= 'm'names[0][1]= 'a'等。)

不幸的是我无法通过。我得到的最接近的是让它为名字指定一个名称,但不再是。

任何帮助都会很棒。实际上有很多我正在和他们一起工作的同学都对此感到难过。我确信对于有经验的人来说很容易,但是我们还没有得到如何做到的好的指导,我找不到很多解决这个问题的具体例子。

正如我所说,我们的教师特别希望函数参数成为指针。

修改
到目前为止,很好的信息,我非常接近这些例子中的一些。我会给他们一个机会,看看有什么用。

2 个答案:

答案 0 :(得分:1)

您必须将read_files定义为:

void read_files(char (*names)[25]) {
    char newName1[5] = "mary";
    char newName2[5] = "anna";
    for(int i = 0; i < 5; i++){
        names[0][i] = newName1[i];
    }
    for(int i = 0; i < 5; i++){
        names[1][i] = newName2[i];
    }   
}

因为您需要将指针传递给char[25]数组。一个两个 维数组不能转换为双指针或单指针。

另请注意,newName1newName2必须是可容纳5个元素的数组。在C a string是以'\0' - 终止字节结尾的字符序列。 这意味着对于长度为n的字符串,您需要一个char长度数组 n+1,因为你需要'\0'的额外字节 - 终止字节。

复制字符串的更好方法是strcpystrncpystrncpy是 比strcpy更安全,因为您限制了要复制的字节数 避免缓冲区溢出。但是strncpy可能不会写'\0' - 终止字节 如果没有足够的空间。

而不是:

for(int i = 0; i < 5; i++){
    names[0][i] = newName1[i];
}

使用它:

strcpy(names[0], newName1);

strncpy方式:

strncpy(names[0], newName1, sizeof names[0]);
names[0][sizeof(names[0]) - 1] = 0; // making sure to add the \0 byte

还要记住,main函数的正确定义可以是 只有其中一个:

  • int main(void);
  • int main(int argc, char **argv);
  • int main(int argc, char *argv[]);

答案 1 :(得分:0)

#include <stdio.h>

void read_files(char* names){
    char newName1[4] = "mary";
    char newName2[4] = "anna";
    for(int i = 0; i < 5; i++){
        names[i] = newName1[i];
    }
    int offset = 25;
    for(int i = 0; i < 5; i++){
        names[i + offset] = newName2[i];
    }
}



void main(){
/*
This is the value being passed. The first dimension has a size of 1000, 
to account for 1000 different sorted people. Second dimension is an 
array that holds the actual name, with a max name length of 25.
*/
    char names[1000][25] = {'\0'};
    read_files(names[0]);
    printf("%s %s", names[0], names[1]);
}

在内存中,2d数组仍然是具有花式寻址的1d块。所以你可以有一个偏移变量,只需将它添加到每个名字上就像我在这里做的那样