繁体   English   中英

如何将字符串数组传递给 function?

[英]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_1a的类型根本不同,并且不兼容。


如果你想让你的 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*
  • 对于 arrays 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM