2016-08-08 9 views
2

この例のように、文字列の配列を関数パラメータとして渡し、文字列配列内の各文字列にstrcpy()を渡す必要があります。C - 関数のパラメータとして文字列の配列を渡す

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'になります。

事前に割り当てられた文字列配列を渡し、上記のように関数内の各文字列を入力するにはどうすればよいですか?

+1

使用チャー**とループ –

+0

は、 "静的ボイドstring_array(CHAR **ポインタ[])" のよう?それはコンパイルされませんでした。 –

答えて

3

string_copy(my_array)を実行しているときは、char (*)[100]、つまりpointer to char[100] arrayを関数に渡しています。しかし、あなたの関数はそのように定義されているので、あなたの関数はchar *[]、すなわちarray of char pointersを期待しています。

char *[]の代わりに、char (*)[100]となるように関数(string_copy())が変更されるように修正することで修正できます。このため

、あなたの関数定義を変更することができますように:

/* 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 **に崩壊します - これはです。このようにして、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]); 
} 
+0

ああ、そうだ。あなたは2つのバージョンがあります、ごめんなさい。 – 2501

+0

@ 2501私は投稿を編集し、将来の読者を混乱させないように、2つのバージョンがあることを強調しました。私はそれを前に置いたやり方が人々を混乱させると思う。 – sps

1

あなたの機能単純マトリクス寸法を受け入れ、リテラルのアレイを記憶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]); 
} 
3

あなたは、配列へのポインタを使用する必要があります。ここでは1次元アレイを有する例である:

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

} 
関連する問題