将一个二维字符数组传递给函数

3

我正在尝试创建一个程序,以获取二维数组并将每一行单独打印出来(如果您曾经参加过Codecademy的Python课程,就像战舰游戏中的课程,我正在尝试打印出游戏板)。我已经进行了多次谷歌搜索,但是似乎互联网上没有很好地介绍二维字符数组。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const int n = 5;
void printgraph(char *graph[]) {
    printf("\nPrinting graph:\n\n");
    int i = 0;
    for(i = 0; i <= 5 - 1; i++) {   // this is only a temporary solution
        printf("i %i | %s\n", i, &graph[i]);    // error here
    }
}

    int main(int argc, char *argv[]) {
    char array[5][6];    // defining the char array here
    strcpy(array[0], "abcde");
    strcpy(array[1], "fghij");
    strcpy(array[2], "klmno");
    strcpy(array[3], "pqrst");
    strcpy(array[4], "uvwxy");
 printf("array: %s\n", array[1]);   // it prints out perfectly within the function itself
    printgraph(*array);    // error here
    return 0;
}

这是终端告诉我的信息

$cc -g -Wall ex3.c -o ex3
ex3.c: In function ‘printgraph’:
ex3.c:11:3: warning: format ‘%s’ expects argument of typechar *’, but argument 3 has typechar **’ [-Wformat=]
   printf("i %i | %s\n", i, &graph[i]);
   ^
ex3.c: In function ‘main’:
ex3.c:23:2: warning: passing argument 1 of ‘printgraph’ from incompatible pointer type [enabled by default]
  printgraph(*array);
  ^
ex3.c:6:6: note: expected ‘char **’ but argument is of type ‘char *’
 void printgraph(char *graph[]) {
      ^
$./ex3
array: fghij

Printing graph:

i 0 | abcde
i 1 | hij
i 2 | o
i 3 | uvwxy
i 4 | 

正如您所看到的,不是所有的数组都能正确地打印出来。我尝试了不同的变化,去掉指针,但这个方法是唯一一个表现相对较好的。


printf 中使用 graph[i] 而不是 &graph[i] - Himanshu
当我这样做时,会出现“分段错误(核心已转储)” - Humbleness
3个回答

5
为什么不直接将整个数组传递给函数,并在函数内部打印所需内容。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const int n = 5;
void printgraph(char graph[][6]) { /* ---> Changes made here */
    printf("\nPrinting graph:\n\n");
    int i = 0;
    for(i = 0; i <= 5 - 1; i++) {   
        printf("i %i | %s\n", i, graph[i]);   /* Check the changes here */
    }
}

int main(int argc, char *argv[]) {
char array[5][6];    // defining the char array here
strcpy(array[0], "abcde");
strcpy(array[1], "fghij");
strcpy(array[2], "klmno");
strcpy(array[3], "pqrst");
strcpy(array[4], "uvwxy");
printgraph(array);    /* Pass the array to the function */
return 0;
}

由于某种原因,当我将其直接复制粘贴到gedit中时,它能够完美地工作,但是除了 "void printgraph(char graph[][6]) {"之外,我找不到你做了什么不同的地方... 非常感谢,我会查看这段代码! - Humbleness

1
一个简单的解决方法是在main()函数中声明一个char类型的双指针作为数组,并将该双指针传递给printgraph()函数。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const int n = 5;
void printgraph(char **graph) {
    printf("\nPrinting graph:\n\n");
    for(int i = 0; i < 5; i++) {   // this is only a temporary solution
        printf("i %i | %s\n", i, graph[i]);   
    }
}

int main(int argc, char *argv[]) {
    char *array[5];
    for(int i=0;i<5;++i)
        array[i] = malloc(6);

    strcpy(array[0], "abcde");
    strcpy(array[1], "fghij");
    strcpy(array[2], "klmno");
    strcpy(array[3], "pqrst");
    strcpy(array[4], "uvwxy");
    printf("array: %s\n", array[1]);    

    printgraph(array); 

    for(int i=0;i<5;++i)
        free(array[i]);

    return 0;
}

在这种方法中,array 本身不需要被 malloc 分配内存,只需要分配 array[i] 的条目。此外,使用 malloc(6) 比使用所有的强制转换、sizeof 和其他麻烦要简单。 - M.M
对不起,我不理解这种方法。如果您能用您的想法修改我的代码会更好。 :) - shauryachats
好的,已编辑。OP可能需要考虑向printgraph添加一个参数或在指针列表的末尾添加一个哨兵值,而不是硬编码5或拥有全局变量。 - M.M
非常感谢。@MattMcNabb - shauryachats

0

由于您将一次解除引用的数组作为参数传递(即第一个数组的地址),因此您只能打印第一个数组。

您可以看到下面的示例中,我们可以利用指向包含6个元素的数组的指针来收集2D数组的地址,其中每个1D数组都有6个元素。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const int n = 5;
void printgraph(char (*graph)[6]) //pointer to array of 6 elements//
    {
        printf("\nPrinting graph:\n\n");
        int i = 0;
        for(i = 0; i <= 5 - 1; i++) {   // this is only a temporary solution
            printf("i %i | %s\n", i, graph[i]);    // error here
    }
}

int main(int argc, char *argv[])
{
    char array[5][6];    // defining the char array here
    printf("%u\n",array);
    printf("%u\n",&array);
    strcpy(array[0], "abcde");
    strcpy(array[1], "fghij");
    strcpy(array[2], "klmno");
    strcpy(array[3], "pqrst");
    strcpy(array[4], "uvwxy");
    printf("array: %s\n", array[1]);   // it prints out perfectly within the function itself
    printgraph(array);    // error here
    return 0;
}

找到输出:

array: fghij

Printing graph:

i 0 | abcde
i 1 | fghij
i 2 | klmno
i 3 | pqrst
i 4 | uvwxy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接