尝试将一个2D字符串数组传递给函数并打印它



新的C,有问题传递指针。我试图传递这个二维数组的指针指向字符串(char[]s)。我一直得到我不能使用%s的错误,因为在函数调用中我将参数声明为char。但是,如果我使用%c,我只打印'H' 'e' 'l'的前三个字符,然后我得到一个分割错误。

Error Code:
format specifies type 'char *' but the argument has type 'char' [-Wformat]
printf("%s ", in[i][j]);
~~    ^~~~~~~~
%c

建议吗?

void printArray(char *in[]){
int i;
int j;
for (i = 0; i < 3; i++){
for (j = 0; j < 3; j++){
printf("%c ", in[i][j]);
}
}

main(){
char *arr1[3][3];
arr1[0][0] ="Hello";
arr1[0][1] = "World";
arr1[0][2] = "Today";
arr1[1][0] = "Is";
arr1[1][1] = "September";
arr1[1][2] = "28";
arr1[2][0] = "th";
arr1[2][1] = "2021";
arr1[2][2] = "yay";
char *j = arr1[0][0];
int k; 
int p;
printf("Before: n");
printArray(&j);

重申一下,目标是发送字符串数组,然后在函数"printArray">

中打印它们对不起,如果这是一个简单的问题,又是一个新的C

谢谢


改变printArray(char *in[])
,
printArray(const char * in[][3])


printArray(&j)

printArray(arr1)

那么,你应该能够使用%s

你正在传递一个1D数组,并希望在打印中使用它作为2D。

使用可变长度数组(VLAs)。它们被添加到C中正是为了这个目的:

void printArray(int n, int m, char *in[n][m]){
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
printf("%s ", in[i][j]);
}
}
}

int main() {
char *arr1[3][3];
... initialize arr1
printArray(3, 3, arr1);
}

编辑

如注释所述,[n]中的size表达式可以省略,因为编译器会忽略它。尽管它对于自我文档仍然很有用。另一种声明可以是:

void printArray(int n, int m, char *in[static n][m])

关键字static指示编译器,至少第一nin指出的元素有效。

如果你想要一个固定大小的数组,你必须相信程序员通过它的规模,就像在@tstanisl回答。这是因为在C语言中,传递给函数的数组会衰变成指针。在@kalyanswaroop答案中,大小被信任为3,但类型检查器从未检查过这一点(这对您可能很重要,也可能不重要)。将数组传递给函数的另一种方法是使用指针,这样静态类型检查器就可以确保数组的大小匹配。(使用cdecl。)

void printArray(char *(*in)[3][3]) {
size_t i, j;
for(i = 0; i < sizeof *in / sizeof **in; i++) {
for(j = 0; j < sizeof **in / sizeof ***in; j++) {
printf("%s ", (*in)[i][j]);
}
}
}

这改变了原型;您可以将其命名为printArray(&arr1)