文字列を(区切り文字を指定して)分割する

 要するに「strtok()を使いやすくまとめてみよう」ということ。

 文字列を分割する際にstrtok()とかを使うんですが、

for文等で毎回回すのも面倒な気がしたので関数化してみた。


/*=====================================
文字列を指定された区切り文字で分割する
--- arg : 分割したい文字列,
delimiter : 区切り文字群,
out : 分割済みの文字列の配列(の格納先)( 要解放 )
→ 分割数(の格納先)
=====================================*/

int DivideString( char *arg, const char *delimiter, char ***out )
{
int arg_num = 0;
char *div_arg = NULL,
*div_token = NULL,
**set_arg = (char**)calloc( 1, sizeof(char*) );

// const・リテラルでもいいようにコピーしておく
div_arg = (char*)calloc( strlen(arg)+1, sizeof(char) );
strcpy( div_arg, arg );

// 分割
div_token = strtok( div_arg, delimiter );

// 分割出来なくなるまで
// 登録 → 分割の繰り返し

for( ; div_token!=NULL ; )
{
arg_num ++;
set_arg = (char**)ReAllocate( set_arg, sizeof(char*)*arg_num );
set_arg[arg_num-1]
= (char*)calloc( strlen(div_token)+1, sizeof(char) );
strcpy( set_arg[arg_num-1], div_token );

div_token = strtok( NULL, delimiter );
}

free( div_arg );

(*out) = set_arg;

return arg_num;
}

分割数が決まっているなら↓で。


/*=====================================
文字列を指定された区切り文字で分割する : 分割数指定
--- arg : 分割したい文字列,
delimiter : 区切り文字群,
divide_num : 分割したい個数
→ 分割済みの文字列の配列( 要解放
/ 指定数に満たない場合は「NULL」で埋める )
=====================================*/

char **DivideString_n( char *arg, const char *delimiter, int divide_num )
{
int arg_num = divide_num;
char *div_arg = NULL,
*div_token = NULL,
**set_arg = (char**)calloc( divide_num, sizeof(char*) );

// const・リテラルでもいいようにコピーしておく
div_arg = (char*)calloc( strlen(arg)+1, sizeof(char) );
strcpy( div_arg, arg );

// 分割
div_token = strtok( div_arg, delimiter );

// 指定回数だけ
// 登録 → 分割の繰り返し

for( ; div_token!=NULL ; )
{
set_arg[divide_num -arg_num]
= (char*)calloc( strlen(div_token)+1, sizeof(char) );
strcpy( set_arg[divide_num -arg_num], div_token );

arg_num --;
if( arg_num == 0 )
{
break;
}

div_token = strtok( NULL, delimiter );
}

// 指定数分分割出来なかったら
// ""で埋めておく

if( arg_num > 0 )
{
for( ; arg_num>0 ; arg_num-- )
{
set_arg[divide_num -arg_num]
= (char*)calloc( 1, sizeof(char) );
}
}

free( div_arg );

return set_arg;
}

…何か仕様が微妙に違うから微妙な気もするな…。