- 2015-12-25
- Visual C++
この間、カンマ分解関数作ったけど、完全にMFC使わない版はちょっと面倒なので、インプットの文字列はchar型でアウトプットはMFC版ってのをつくってみたよ。
システム開発の現場では工数とメンテナンス性を考えるとこれが一番現実的なとこかな。
//============================================================================ // 【機 能】 分解関数 // // 【説 明】 インプットに指定された文字列を指定デリミタ毎に配列に設定する。 // // 【入出力】 LPCTSTR (IN) : 分解したい文字列 // LPCTSTR (IN) : 分解対象デリミタ(カンマ等) // bool (IN) : 空文字を配列対象とするか(true:する false:しない) // CStringArray&(OT) : 分解した文字列の配列 // // 【戻り値】 なし // // 【備 考】 アウトプットは当関数内で初期化しないので呼び出し元で // 必要に応じて初期化してから呼び出すこと。 //============================================================================ void DelimiterParse2( LPCTSTR pchInBuff, LPCTSTR pchDelimiter, bool boption, CStringArray& carrOutBuff ) { if ( pchInBuff == NULL || pchDelimiter == NULL ) { return; } //-------------------------------------------------------------------------- //カンマ分解処理 //-------------------------------------------------------------------------- //アウトプットセット用 size_t nLen = lstrlen(pchInBuff); LPTSTR pchOutBuff = new TCHAR[nLen+1]; memset( pchOutBuff, NULL, (nLen+1) * sizeof(TCHAR) ); LPCTSTR pchSearch = NULL; LPCTSTR pInPnt = pchInBuff; //アドレスサーチ用 pInPnt = pchInBuff; //アドレスサーチ用 pchSearch = _tcsstr( pInPnt, pchDelimiter ); while ( pchSearch != NULL ) { if ( boption == false && pInPnt == pchSearch ) { pInPnt = pchSearch + 1; pchSearch = _tcsstr( pInPnt, pchDelimiter ); continue; } //アウトプットセット memset( pchOutBuff, NULL, (nLen+1) * sizeof(TCHAR) ); memcpy( pchOutBuff, pInPnt, (pchSearch - pInPnt) * sizeof(TCHAR) ); carrOutBuff.Add( pchOutBuff ); pInPnt = pchSearch + 1; pchSearch = _tcsstr( pInPnt, pchDelimiter ); } memset( pchOutBuff, NULL, (nLen+1) * sizeof(TCHAR) ); memcpy( pchOutBuff, pInPnt, _tcslen(pInPnt) * sizeof(TCHAR) ); carrOutBuff.Add( pchOutBuff ); delete [] pchOutBuff; pchOutBuff = NULL; return; }
呼び出し方
TCHAR chBuff[500]={NULL}; memcpy( chBuff, _T("aa,bb,ccc,dd,,ee"), 500 ); CStringArray carr; DelimiterParse2( chBuff, _T(","), true, carr ); CString sss; for( int iii = 0 ; iii < carr.GetCount(); iii++ ) { sss = carr.GetAt(iii); }
こんな感じ。