C 字符串分割

 

/*******************************************************************************
 *  関数名称  :FTLCOM900_SplitChar
 *                文字列分割処理
 *------------------------------------------------------------------------------
 *  機能概要  :分解対象文字列を、キーワードで分割する(区切:対象文字を'\0'で
 *              上書き)。
 *              分割した文字列の先頭ポインタを、分割アイテムポインタ配列に設定。
 *              分割した文字列が以下の場合は、処理結果チェックエラーとし、出力
 *              パラメータにエラー内容を格納する。(格納値はdefine定義参照)
 *                ・分割した文字列の個数が、iMaxCntより多い場合
 *                ・分割した文字列が、 iMaxLenより長い場合
 *
 *  パラメータ:<I/O> char*  pczInputText  分解対象文字列
 *              <I>   char*  pczKeyWord    キーワード。区切り文字群。
 *                                         複数の区切り文字を指定することが可能
 *                                         例) '?' と '/'と '!' で区切りたい場合
 *                                             ""?/!"" と指定する
 *              <I>   int    iMaxCnt       分解可能な最大件数(分割アイテム確保数)
 *              <I>   int    iMaxLen       分解文字列の最大長(指定なし:0)
 *              <O>   int*   piItemCnt     分割アイテム取得数
 *              <O>   char** pArray        分割アイテムポインタ配列
 *              <O>   int*   piErrDetail   処理結果エラー詳細情報
 *
 *  リターン値:int   FTL_RESULT_NORMAL       処理結果正常
 *              int   FTL_RESULT_CHK_ERROR    処理結果チェックエラー
 *              int   FTL_RESULT_SYSTEM_ERROR 処理結果異常(ロジックエラー)
 ******************************************************************************/

int SplitChar(char* pczInputText, char* pczKeyWord, int iMaxCnt, int iMaxLen, int* piItemCnt, char** pArray,
	int* piErrDetail)
{
	/* ローカル変数の宣言 */
	int iCount = 0; /* ループカウンタ */
	char czLog[FTL_LOG_MAX_LEN + 1]; /* ログ情報 */
	char * pcTemp = NULL; /* 分解文字列のポインタ */
	int iInputTextLen = 0; /* 分解文字列の長さ */

	/* 分解対象文字列(pczInputText)がNULL場合 */
	if ( NULL == pczInputText )
	{
		/* システムエラー(FTL_RESULT_SYSTEM_ERROR)を呼び出し元に返却する */
		return FTL_RESULT_SYSTEM_ERROR;
	}

	/* キーワード(pczKeyWord)がNULL場合 */
	if ( NULL == pczKeyWord )
	{
		/* システムエラー(FTL_RESULT_SYSTEM_ERROR)を呼び出し元に返却する */
		return FTL_RESULT_SYSTEM_ERROR;
	}

	/* 分割アイテム取得数(piItemCnt) */
	if ( NULL == piItemCnt )
	{
		/* システムエラー(FTL_RESULT_SYSTEM_ERROR)を呼び出し元に返却する */
		return FTL_RESULT_SYSTEM_ERROR;
	}

	/* 分割アイテムポインタ配列(pArray)がNULL場合 */
	if ( NULL == pArray )
	{
		/* システムエラー(FTL_RESULT_SYSTEM_ERROR)を呼び出し元に返却する */
		return FTL_RESULT_SYSTEM_ERROR;
	}

	/* 処理結果エラー詳細情報(piErrDetail)がNULLの場合 */
	if ( NULL == piErrDetail )
	{		
		/* システムエラー(FTL_RESULT_SYSTEM_ERROR)を呼び出し元に返却する */
		return FTL_RESULT_SYSTEM_ERROR;
	}

	/* FT_IC_MODULE デバッグログ使用 start */
	/* ローカル変数を初期化する */
	iInputTextLen = (int)strlen(pczInputText);
	/* FT_IC_MODULE デバッグログ使用 end */

	/* 分解文字列のポインタ(pcTemp)にpczInputTextを設定する */
	pcTemp = pczInputText;

	/* ループ条件:分解文字列(pcTemp)がNULL以外の場合、分割アイテムポインタ配列の設定処理を行う */
	while ( 1 == 1 )
	{
		/* 分割アイテム(pArray[iCount])にpcTempを設定する */
		pArray[iCount] = pcTemp;

		/* 分解文字列取得 */
		pcTemp = strpbrk(pArray[iCount], pczKeyWord);

		/* 分解文字列(pcTemp)がNULLの場合 */
		if ( NULL == pcTemp )
		{
			/* 分割アイテムポインタ配列の設定処理のLoopを抜ける */
			break;
		}

		/* 分解文字列(pcTemp[0])に0x00を設定する */
		pcTemp[0] = '\0';

		/* 分解文字列(pcTemp)にpcTemp + 1を設定する */
		pcTemp += 1;

		/* ループカウンタ(iCount)にiCount + 1を設定する */
		iCount++;
	}

	/* 分割アイテム取得数設定する */
	*piItemCnt = iCount + 1;

	/* 分割アイテム取得数 > 分解可能な最大件数場合 */
	if ( *piItemCnt > iMaxCnt )
	{
		/* 処理結果エラー詳細情報(*piErrDetail)を
		 * FTLCOM900_SPLITCHAR_ERR_CNTに設定する */
		*piErrDetail = FTLCOM900_SPLITCHAR_ERR_CNT;

		/* チェックエラー(FTL_RESULT_CHK_ERROR)を呼び出し元に返却する */
		return FTL_RESULT_CHK_ERROR;
	}

	/* 分解文字列の最大長チェック要否判定処理を行う
	 * 引数: 分解文字列の最大長(iMaxLen) != FTLCOM900_SPLITCHAR_NOT_CHECK_MAXLENの場合 */
	if ( FTLCOM900_SPLITCHAR_NOT_CHECK_MAXLEN != iMaxLen )
	{
		/* ループ条件:ループカウンタが*piItemCntになるまで
		 * 分解文字列の最大長チェック処理を行う */
		for ( iCount = 0; iCount < *piItemCnt; iCount++ )
		{
			/* 分解文字列の最大長(iMaxLen) < strlen(pArray[iCount])の場合 */
			if ( iMaxLen < (int)strlen(pArray[iCount]) )
			{
				/* 処理結果エラー詳細情報(*piErrDetail)を
				 * FTLCOM900_SPLITCHAR_ERR_LENに設定する */
				*piErrDetail = FTLCOM900_SPLITCHAR_ERR_LEN;

				/* チェックエラー(FTL_RESULT_CHK_ERROR)を呼び出し元に返却する */
				return FTL_RESULT_CHK_ERROR;
			}
		}
	}

	/* 処理結果エラー詳細情報(*piErrDetail)をFTLCOM900_SPLITCHAR_OKに設定する */
	*piErrDetail = FTLCOM900_SPLITCHAR_OK;

	/* 正常終了(FTL_RESULT_NORMAL)を呼び出し元に返却する */
	return FTL_RESULT_NORMAL;
}

转载于:https://my.oschina.net/guanyun/blog/68112

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值