○区切り文字による文字列の切り出し

■strtokによる文字列切り出し
注意
strtokは、先頭に区切り文字が無いとエラーが出ますので追加します。
区切り文字が連続した場合に読み飛ばして一つにしてしまいます。
そのため値が無い区切り文字が含まれるとバグを作りこみます。
#include <stdio.h>
#include <string.h>

int main(){

	//strtokは、先頭に区切り文字が無いとエラーが出ますので追加します。
	char*str="aa,bb,cc,dd,ee,ff";
	char strPos[128];
	strPos[0]=',';
	strcpy(strPos+1,str);
	//この時点でstrPosの内容は",aa,bb,cc,dd,ee,ff"になります
	
	char*r;
	
	r=strtok(strPos,",");//一文字目を切り出します。
	printf("%s\n",r);
	
	while(r=strtok(NULL,",")){//次の文字を切り出します。無ければNULLを返します。
		printf("%s\n",r);
	}

	return 0;
}

▼出力結果
aa
bb
cc
dd
ee
ff


■ライブラリを使わずに行う

strtokみたいに複数の文字を区切り文字にしたりは出来ないですが、一つの文字での切り出しは出来ます
区切り文字の間に値が無い場合には空白文字を切り出します。
先頭に区切り文字は必要ないです。
#include <stdio.h>

char* str_split(char*buf,char c){
	static char*_buff;
	if(buf)	_buff=buf;//バッファに文字列が来たら保存する
	if('\0' == *_buff) return NULL; //バッファの先頭が終端文字だとNULLを返す
	char*head = _buff;//先頭の位置を保存する
	while(*_buff){
		if(c == *_buff){
			*_buff='\0';
			_buff++;
			break;
		}
		_buff++;
	}
	return head;
}

int main()
{
	char*str="a,b,,,c,d,今日は,晴天";
	char*r;
	r=str_split(str,',');//一文字目を切り出します。
	printf("[ %s ]\n",r);
	
	while(r=str_split(NULL,',')){//次の文字を切り出します。無ければNULLを返します。
		printf("[ %s ]\n",r);
	}
	return 0;
}

▼実行結果
[ a ]
[ b ]
[ ]
[ ]
[ c ]
[ d ]
[ 今日は ]
[ 晴天 ]




▲トップページ > Windows と C++