[英]How to pass a string array to a function?
我已经宣布:
char array_slave_1[128][128];
int array_length(char *a[]){
int i = 0;
while(a[i] != NULL){
i++;
}
return i;
}
int x = array_length(array_slave_1);
我得到:
main.c:101:26: warning: passing argument 1 of ‘array_length’ from incompatible pointer type [-Wincompatible-pointer-types]
101 | int x = array_length(array_slave_1);
| ^~~~~~~~~~~~~
| |
| char (*)[128]
main.c:16:24: note: expected ‘char **’ but argument is of type ‘char (*)[128]’
16 | int array_length(char *a[]){
我不确定将参数传递给我声明的 function 的方式是否正确......我认为问题出在这个问题上,但我不知道如何正确实现 function array_lenght。
char array_slave_1[128][128]
这是 char 作为参数的二维数组:
int array_length(char *a[])
这是指向 char 的指针数组(可能是 C 字符串,但也可能是其他字符/字节缓冲区或单个字符)。 除了因为它是一个 function 参数外,它实际上是指向指针的指针,所以如果您是新手,最好写出它的真正含义,以免混淆:
int array_length(char **a)
array_slave_1
和a
的类型根本不同,并且不兼容。
如果你想让你的 function 将数组作为参数,你可以这样做:
int array_length(char a[][128])
这与此相同(请注意与相关代码相比额外的()
,它们很重要),因为数组参数确实是指针,因此您有一个指向一个或多个char[128]
缓冲区的指针:
int array_length(char (*a)[128])
但是,您需要一种不同的方法来确定数组长度。 也许空字符串意味着字符串的结尾? 这取决于你,真的。
另一种方法是将您的数组更改为指针数组:
char *array_slave_1[128]; // 128 pointers to char buffer or C string
// remember that you must allocate the space of each string!
也许你只是“过于复杂”的事情。
这是您可能要实现的目标的“最佳猜测”(基于为 128x 字符串分配空间,每个字符串最多 127 个字节(加上 null 终止符。)
#include <stdio.h>
#include <string.h>
int main() {
char array_slave_1[ 128 ][ 127 + 1 ]; // notation helps signify this is a string
strcpy( array_slave_1[ 0 ], "Hello World!" );
strcpy( array_slave_1[ 1 ], "Foobar" );
for( int i = 0; i < 2; i++ )
printf( "'%s' length %d\n", array_slave_1[ i ], strlen( array_slave_1[ i ] ) );
return 0;
}
Output
'Hello World!' length 12
'Foobar' length 6
strlen()
已经在标准 C 库中完成。
char array_slave_1[128][128];
是char
的 arrays 的数组,通常称为二维数组。char *a[]
是指向char
的指针数组。 它与二维数组不兼容。当 C 中的数组在大多数表达式中使用时,或者当声明为 function 参数时,它“衰减”为指向它的第一个元素的指针。
char array[x]
,第一个元素是char
,因此它衰减为指向char
的指针: char*
。char array[x][y]
的数组,第一个元素是数组char [y]
。 所以它衰减成一个指向这样一个数组的指针, char (*)[y]
。 这种衰减发生在您作为参数传递的数组以及声明为 function 参数的任何二维数组上。因此:
void func (char array[128][128]);
...
char array [128][128];
func(array);
100% 相当于:
void func (char (*array)[128]);
...
char array [128][128];
char(*ptr)[128] = array;
func(array);
因此,为了接受二维数组,您可以使用上述等效的 forms 中的任何一个来声明 function,尽管后者的可读性较差。 然而,最通用和可读的形式可能是可变长度数组:
void func (size_t x, size_t y, char array[x][y]);
另请注意, while(a[i] != NULL)
仅适用于指针的 arrays ,其中最后一个指针分配给 NULL,即所谓的“哨兵值”。 除非您将 function 保留为char* arr[n]
然后将指针数组作为参数传递,否则您不能使用它。
如何将字符串数组传递给 function?
这取决于您所说的“字符串数组”是什么意思,因为事实证明 C 中有两种完全不同类型的“字符串”。 形式上,字符串是一个字符数组。 但是由于 arrays 在使用它们时几乎总是衰减为指针,因此非常普遍地认为char *
(即指向char
的指针)也是 C 中的“字符串类型”。
char array_slave_1[128][128];
这是char
的 arrays 数组。 所以它是一个有用的字符串数组,使用“字符串”的数组定义。 它确实有一个限制,它包含的任何字符串都不能超过 127 个字符。
int array_length(char *a[]) {...
这个 function 接受指向char
的指针数组。 所以它也是一个有用的字符串数组,使用“字符串”的指针定义。 更明显的是,鉴于您正在寻找NULL
指针来标记数组的结尾,因此您正在尝试在此处使用指针数组。
但! 在这种情况下,两种不同类型的“字符串数组”是不兼容的。 arrays 数组与指针数组完全不同,没有自动转换可以让您从一个开始。 并把它当作另一个。
(这与简单的单个字符串的情况形成对比,因为数组衰减到指针规则总是让您将数组字符串视为指针字符串。)
你最好的选择可能是改变
char array_slave_1[128][128];
至
char *array_slave_1[128];
现在你有一个包含 128 个指针字符串的数组。 这将与您的array_length
function 兼容,它将消除对数组中各个字符串长度的限制。 另一方面,您将需要更改用于初始化和操作array_slave_1
中的字符串的任何代码:其中一些代码可能仍然可以,但是任何涉及诸如strcpy(array_slave_1[i], ...)
之类的代码都会必须改变。 根据您的需要,您可能还需要调用malloc
为数组中要指向的每个元素分配空间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.