【问题标题】:C - Pass Array of Strings as Function ParameterC - 将字符串数组作为函数参数传递
【发布时间】:2016-08-08 05:59:35
【问题描述】:

我需要将一个预先分配的字符串数组作为函数参数传递,并将 strcpy() 传递给字符串数组中的每个字符串,如下例所示:

 static void string_copy(char * pointer[]) {

    strcpy(pointer[0], "Hello ");

    strcpy(pointer[1], "world");

}

int main(int argc, const char * argv[]) {

    char my_array[10][100];

    string_copy(my_array);

    printf("%s%s\n", my_array[0], my_array[1]);

}

打印出来的字符串是“Hello world”。

如上所示,如何传递预先分配的字符串数组并填写函数中的每个字符串?

【问题讨论】:

  • 使用 char** 和 for 循环
  • 如“static void string_array(char ** pointer[])”?那没有编译。

标签: c arrays string


【解决方案1】:

当您执行string_copy(my_array) 时,您将char (*)[100],即pointer to char[100] array 传递给您的函数。但是您的函数需要一个char *[],即array of char pointers,因为您已经以这种方式定义了您的函数。

您可以通过进行更改来解决此问题,以便您的函数 (string_copy()) 需要 char (*)[100],而不是 char *[]

为此,您可以将函数定义更改为:

/* Your my_array gets converted to pointer to char[100]
   so, you need to change your function parameter
   from `char *pointer[]` to `char (*pointer)[100]` 
*/ 
/* static void string_copy(char *pointer []) */
static void string_copy(char (*pointer) [100])
{
    strcpy(pointer[0], "Hello ");
    strcpy(pointer[1], "world");
}

* 替代解决方案 *

另一种设计/解决方案是更改您的 main() 函数,以便您实际上char *[] 衰减为 char ** - 这很好 - 到 @ 987654333@。这样您就不必更改 string_copy() 函数。

int main(int argc, const char * argv[]) {

    char my_array[10][100];
    int tot_char_arrs, i;
    char *char_arr_ptr[10];

    /* Get total number of char arrays in my_array */
    tot_char_arrs = sizeof(my_array) / sizeof(my_array[0]);

    // Store all char * 
    for (i = 0; i < tot_char_arrs; i++)
            char_arr_ptr[i] = my_array[i];

    /* Actually passing a char *[].
       it will decay into char **, which is fine
     */
    string_copy(char_arr_ptr);

    printf("%s%s\n", my_array[0], my_array[1]);
}

【讨论】:

  • 哦,我明白了。抱歉,您有两个版本。
  • @2501 我编辑了帖子并强调有两个版本,以免让未来的读者感到困惑。我认为我之前所说的方式可能会让人们感到困惑。
【解决方案2】:

您需要使用指向数组的指针。这是一个一维数组的例子:

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

static void string_copy(char **pointer) {

    strcpy(pointer[0], "Hello ");

}

int main(int argc, const char * argv[]) {

    char my_array[10];
    char * p_array = my_array;

    string_copy(&p_array);

    printf("%s\n",  my_array);

}

【讨论】:

    【解决方案3】:

    您的函数可以简单地接受矩阵维度并传递一个 const char * 来存储文字(预分配)字符串数组:

    #include <stdio.h>
    #include <string.h>
    
    #define STRINGS_LENGTH 100
    
    static void string_copy(size_t n, size_t m, char pointer[n][m], const char *strings_to_copy[])
    {
        for (size_t i=0; i< n; i++)
        {
            strcpy(pointer[i], strings_to_copy[i]);
        }
    }
    
    int main( void )
    {
        const char *strings[] = { "hello", "World" };
        char my_array[sizeof(strings)/sizeof(strings[0])][STRINGS_LENGTH];
    
        string_copy(sizeof(strings)/sizeof(strings[0]), STRINGS_LENGTH, my_array, strings);
    
        printf("%s %s\n", my_array[0], my_array[1]);
    }
    

    您还可以使用输出数组的动态分配来更改代码的结构,例如:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <stdbool.h>
    
    static bool string_copy(char *pointer[], const char *strings_to_copy[], size_t strings)
    {
    
        for (size_t i=0; i< strings; i++)
        {
            pointer[i] = malloc(strlen(strings_to_copy[i])+1);
    
            if (pointer[i] != NULL)
                strcpy(pointer[i], strings_to_copy[i]);
            else
                return false;
        }
    
        return true;
    }
    
    int main(void)
    {
        const char *strings[] = { "hello", "World" };
        char *my_array[sizeof(strings)/sizeof(strings[0])] = {0};
    
        if (string_copy(my_array, strings, sizeof(strings)/sizeof(strings[0])) )
        {
            printf("%s %s\n", my_array[0], my_array[1]);
        }
    
        for (size_t i = 0; i<sizeof(strings)/sizeof(strings[0]); i++)
            free (my_array[i]);
    }
    

    【讨论】: