#include #include #include /* 指定された区切り文字で分割した文字列の配列を返す。配列の最後尾はNULLになっている。 エラーの場合はNULLを返す。 使用後はsplit_free()を呼び出してメモリを解放する必要がある。 strtok()を使っているので、MT非セーフ。 */ char** split(const char *str, const char *delim) { char **arr = NULL; //配列 int n = 0; //配列の個数 char *buf, *tp; if (str == NULL || delim == NULL) { return NULL; } buf = (char*)malloc(strlen(str) + 1); if (buf == NULL) { return NULL; } strcpy(buf, str); for(tp = strtok(buf, delim); tp; tp = strtok(NULL, delim)) { char **a = (char**)realloc(arr, sizeof(*arr) * (n+3)); if (a == NULL) { free(arr); free(buf); return NULL; } a[++n] = tp; arr = a; } if (arr != NULL) { arr[0] = buf; //元のバッファを保持する arr++; arr[n] = NULL; //終端 } return arr; } /* split()で確保したメモリを解放する。 */ void split_free(char **arr) { if (arr != NULL) { arr--; free(arr[0]); //元のバッファを解放する free(arr); } } int main(void) { char **arr = split("aaa,bb,cccc", ","); if (arr != NULL) { int i; for(i = 0; arr[i] != NULL; i++) { printf("%d:%s\n", i, arr[i]); } split_free(arr); } return 0; }