文字列バッファを行単位で取得するには次の手順で行います。(戻る)
- 文字列バッファの先頭位置を記憶する(lpSeek)
- 記憶位置の先頭を lpGets に保存する(lpGets)
- 記憶位置から改行まで移動し NULL 文字を書き込む
- 保存した lpGets を返す
- lpString に NULL が渡されたら(2)へ移動し繰り返す
- 記憶位置が NULL 文字なら NULL を返す
プロトタイプ宣言
LPTSTR funcLineString( LPTSTR lpString // 文字列へのポインタ );
サンプル
// 文字列バッファを行単位で取得 extern LPTSTR funcLineString( LPTSTR lpString ) { static LPTSTR lpSeek; static LPTSTR lpGets; if ( lpString ){ lpSeek = lpString; } if ( lpSeek ){ if ( *lpSeek != TEXT('\0') ){ for ( lpGets = lpSeek ; *lpSeek != TEXT('\0') ; lpSeek++ ){ if ( lpSeek[0] == TEXT('\r') ){ if ( lpSeek[1] == TEXT('\n') ){ *lpSeek++ = TEXT('\0'); } goto CRLF; } if ( lpSeek[0] == TEXT('\n') ){ CRLF: *lpSeek++ = TEXT('\0'); break; } } return lpGets; } } return NULL; } // 使用例 int main( void ) { HWND hWnd = GetDesktopWindow(); DWORD dwLine = 0; LPTSTR lpClip; LPTSTR lpGets; if ( (lpClip = funcClipGets(hWnd)) != NULL ){ if ( (lpGets = funcLineString(lpClip)) != NULL ){ do { printf( TEXT("%05u %s\r\n"), ++dwLine, lpGets ); } while ( (lpGets = funcLineString(NULL)) != NULL ); } // 使用後は必ず解放 GlobalFree( lpClip ); return 0; } printf( TEXT("クリップボードが開けないか、またはデータがありません。\n") ); return 1; }
- lpString に行単位で取得する文字列を指定します。
- lpString に文字列ポインタを渡すと先頭行を返します。
- lpString に NULL ポインタを渡すと後続行を返します。
注意事項
- lpString の文字列は funcLineString()関数の内部で NULL 文字(\0)を書き込み行単位で分離します。
- よって LPCTSTR の文字列は渡せません。
- また、文字列内容を書き換えたくない場合は、一時バッファにコピーして、その文字列を渡します。
その他
- funcLineString 関数は「マルチバイト文字セット」、「Unicode文字セット」の両方に対応しています。
- 使用例のコンパイル時は printf 使用のため「マルチバイト文字セット」で行って下さい。
- なお、使用例ではクリップボードの内容を行番号付きで表示します。
関連記事
- 文字列バッファに NULL 文字を書き込む - funcZeroString()
- 文字列バッファに指定文字を書き込む - funcFillString()
- 文字列バッファに指定サイズだけ書き込む - funcCopyString()
- 文字列バッファの複製文字列を作成 - funcDupString()
- 文字列バッファを行単位で取得 - funcLineString()
- 文字列バッファの改行コードを削除 - funcCRLFString()
- 文字列バッファの基本関数(まとめ)
※コメント投稿者のブログIDはブログ作成者のみに通知されます