簡體   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