2次元配列の動的確保

この例題では、'\n'の区切り文字毎に分けられる文字列を記憶する配列をそれぞれ動的に確保する例題です。それぞれの配列は2次元配列として確保されます。

2次元配列の動的確保例list_37.c)
#include <stdio.h>

#define MAX_STRN 10 /* 文字列の最大確保数 */
static char text[] = "aaaaaa\nbbb\nccccccc\nddddd\n";

///////////////////////////////////////////////////////
char* give_string(char* string);
///////////////////////////////////////////////////////

int main()
{
    int i,scnt=0;
    char seps[]="\n",*token;
    char **str;

    str = (char**)calloc(MAX_STRN,sizeof(char*)); /* 2次元配列の確保 */
    
    /* トークン(\n)毎に文字列の抽出(確保する領域数の計算) */
    scnt = 0;
    token = (char*)strtok( text,seps );
    while( token != NULL ){ /* buf にトークンがなくなるまで繰り返す */
        printf("token[%d]:%s\n",scnt,token);
        str[scnt] = give_string(token);
        token = (char*)strtok( NULL, seps ); /* 次のトークンへ */
        scnt ++;
    }
    printf("scnt = %d\n",scnt);


    /* 表示して確認 */
    printf("[str]配列内容:\n");
    for(i=0;i<scnt;i++){
        printf("str[%d]:%s\n",i,str[i]);
    }


    /* char型データの解放 */
    for(i=0;i<scnt;i++) free(str[i]);
    free(str);
    return 0;
}

/* 文字列の領域を自動的に確保してコピー */
char* give_string(char* string)
{
    char *tempp=(char*)calloc(strlen(string+1),sizeof(char));
    strcpy(tempp,string);
    return tempp;
}
実行結果
Gami[58]% ./list_37.exe
token[0]:aaaaaa
token[1]:bbb
token[2]:ccccccc
token[3]:ddddd
scnt = 4
[str]配列内容:
str[0]:aaaaaa
str[1]:bbb
str[2]:ccccccc
str[3]:ddddd
Gami[59]%
inserted by FC2 system