/**********************************/ /* PROGRAM NAME : BCC005.cpp */ /* AUTHOR : ymlib.com */ /* MAKE DAY : 2005/10/23 */ /**********************************/ /********************/ /* */ /* セパレータ分割 */ /* */ /********************/ #include #include #include /* プロトタイプ宣言 */ void getToken( const char* pBuf, char*** ppaList, int* iCnt ); int main( int argc, char** argv ) { char **ppaList; /* 要素を格納した領域へのポインタ */ int iCnt; /* 要素数 */ int i; /* ループカウンタ */ fprintf( stdout, "BCC005 start!!\n" ); /* パラメータチェック */ if ( argc != 2 ) { fprintf( stdout , "セパレータ分解する文字列を指定して下さい。\n" ); exit( -1 ); } /* 変数初期化 */ ppaList = NULL; /* セパレータ分割 */ getToken( argv[1], &ppaList, &iCnt ); /* 結果表示 */ fprintf( stdout, "要素数=[%d]\n", iCnt ); for ( i = 0; i < iCnt; i++ ) { fprintf( stdout , "%2d:[%s]\n" , i + 1 , ppaList[i] ); } /* 領域解放(2元目) */ for ( i = 0; i < iCnt; i++ ) { free( ppaList[i] ); } /* 領域解放(1元目) */ free( ppaList ); fprintf( stdout, "BCC005 end!!\n" ); return( 0 ); } /************************************************************/ /* */ /* getToken() */ /* */ /* 引数で受け取った文字列 paBuf をセパレータ「,」で区切り */ /* 2次元配列に格納し返す。 */ /* */ /************************************************************/ void getToken( const char* paBuf, char*** ppaList, int* iCnt ) { unsigned int i; /* ループカウンタ */ unsigned int iLen; /* paBufの長さ */ unsigned int iStart; /* 要素の開始位置 */ unsigned int iDataLen; /* 要素の長さ */ int iToken; /* 要素数 */ int iMemSize; /* 確保するメモリのサイズ */ /* 引数がNULLの場合 */ if ( paBuf == NULL ) { *iCnt = 0; return; } /* 引数の文字列長を取得 */ iLen = strlen( paBuf ); /* 引数の文字列長が0バイトの場合 */ if ( iLen == 0 ) { *iCnt = 0; return; } /* 要素の数を数える */ *iCnt = 1; for ( i = 0; i < iLen; i++ ) { if ( paBuf[i] == ',' ) { ( *iCnt )++; } } /* 確保する領域の計算 */ iMemSize = sizeof( char** ) * ( *iCnt ); /* 領域確保(1元目) */ *ppaList = ( char** )malloc( iMemSize ); /* 確保した領域の初期化 */ memset( *ppaList, 0x00, iMemSize ); /*********************************************/ /* セパレータ「,」区切りで文字列を要素へ分解 */ /*********************************************/ iStart = 0; iToken = 0; for ( i = 0; i < iLen; i++ ) { /* セパレータ「,」のチェック */ if ( paBuf[i] == ',' ) { /* データ長の計算 */ iDataLen = i - iStart; /* 確保する領域の計算 */ iMemSize = sizeof( char ) * ( iDataLen + 1 ); /* 領域確保(2元目) */ ( *ppaList )[iToken] = ( char* )malloc( iMemSize ); /* 確保した領域の初期化 */ memset( ( *ppaList )[iToken], 0x00, iMemSize ); /* データを設定 */ if ( iDataLen == 0 ) { /* セパレータが連続した場合「,,」、 */ /* 空文字を設定 */ strncpy( ( *ppaList )[iToken], "", 1 ); } else { strncpy( ( *ppaList )[iToken] , &paBuf[iStart] , iDataLen ); ( *ppaList )[iToken][iDataLen] = 0x00; } /* 要素の開始位置をセパレータ「,」の次へ */ iStart = i + 1; /* 要素数を加算 */ iToken++; } } /**************/ /* 最後の要素 */ /**************/ /* データ長の計算 */ iDataLen = i - iStart; /* 確保する領域の計算 */ iMemSize = sizeof( char ) * ( iDataLen + 1 ); /* 領域確保(2元目) */ ( *ppaList )[iToken] = ( char* )malloc( iMemSize ); /* 確保した領域の初期化 */ memset( ( *ppaList )[iToken], 0x00, iMemSize ); if ( iDataLen == 0 ) { /* セパレータが連続した場合「,,」、空文字を設定 */ strncpy( ( *ppaList )[iToken], "", 1 ); } else { strncpy( ( *ppaList )[iToken] , &paBuf[iStart] , iDataLen ); ( *ppaList )[iToken][iDataLen] = 0x00; } return; }