2016-08-08 44 views
2

Ich brauche eine vorab zugewiesene Array von Zeichenketten als Funktion Parameter zu übergeben, und strcpy(), um jede der Zeichenfolgen innerhalb des String-Array, wie in diesem Beispiel:C - Pass Array von Zeichenketten als Funktion Parameter

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]); 

} 

Und die resultierende gedruckte Zeichenfolge wäre "Hallo Welt".

Wie übergebe ich ein vorab zugeordnetes String-Array und fülle jeden String innerhalb einer Funktion aus, wie oben gezeigt?

+1

Verwendung char ** und eine for-Schleife, wie in –

+0

"static void string_array (char ** pointer [])"? Das hat nicht kompiliert. –

Antwort

3

Wenn Sie dabei sind string_copy(my_array), übergeben Sie eine char (*)[100], d. H. pointer to char[100] array an Ihre Funktion. Aber Ihre Funktion erwartet eine char *[], d. H. array of char pointers, weil Sie Ihre Funktion auf diese Weise definiert haben.

Sie können dies beheben, indem Sie Änderungen vornehmen, damit Ihre Funktion (string_copy()) eine char (*)[100] anstelle einer char *[] erwartet.

Dazu können Sie Ihre Funktionsdefinition ändern:

/* 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"); 
} 

* Alternative Lösung *

Ein anderes Design/Lösung in Ihrer main() Funktion würde sich ändern, so dass Sie sind tatsächlich übergibt eine char *[], die in eine char ** zerfällt - was in Ordnung ist - zu string_copy(). Auf diese Weise müssten Sie Ihre string_copy() Funktion NICHT ändern.

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]); 
} 
+0

Oh, ich verstehe. Sie haben zwei Versionen, sorry. – 2501

+0

@ 2501 Ich habe den Beitrag bearbeitet und hervorgehoben, dass es zwei Versionen gibt, so dass zukünftige Leser nicht verwirrt werden. Ich denke, die Art und Weise, wie ich es vorher gesagt habe, könnte die Leute verwirren. – sps

1

Ihre Funktion kann einfach Matrix Dimensionen annehmen und eine const char * übergeben, die das Array von Literalen (vorab zugewiesene) Strings speichert:

#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]); 
} 

Sie können auch die Struktur des Codes ändern dynamische Zuordnung verwenden für Ihre Ausgabe-Array wie:

#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]); 
} 
3

müssen Sie einen Zeiger auf das Array verwenden. Hier ist ein Beispiel mit 1 dimensionales Array:

#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); 

}