プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

文字列バッファの改行コードを削除 - funcCRLFString()

2010年02月14日 08時20分00秒 | 便利ライブラリ関数

文字列バッファの改行コードを削除し、ダブル NULL 文字列に変換します。
ダブル NULL 文字列とは次の形式です。(戻る)

1行目の文字列\0
2行目の文字列\0
3行目の文字列\0
\0
↑
最後がダブル NULL 文字(\0)になる文字列です。

プロトタイプ宣言

LPTSTR funcCRLFString(
    LPTSTR  lpString    // 文字列へのポインタ
);

サンプル

// 文字列バッファの改行コードを削除
extern LPTSTR funcCRLFString( LPTSTR lpString )
{
    LPTSTR lpDest = lpString;
    LPTSTR lpTail = lpString;
    
    while ( (*lpTail == TEXT('\r')) || (*lpTail == TEXT('\n')) ){
        lpTail++;
    }
    if ( *lpTail != TEXT('\0') ){
        while ( *lpTail != TEXT('\0') ){
            if ( (*lpTail == TEXT('\r')) || (*lpTail == TEXT('\n')) ){
                while ( (*lpTail == TEXT('\r')) || (*lpTail == TEXT('\n')) ){
                    lpTail++;
                }
                *lpDest++ = TEXT('\0');
            }
            else{
                *lpDest++ = *lpTail++;
            }
        }
        *lpDest++ = TEXT('\0');
        *lpDest++ = TEXT('\0');
    }
    return lpString;
}

// 使用例
int main( void )
{
    HWND    hWnd = GetDesktopWindow();
    DWORD   dwLine = 0;
    LPTSTR  lpClip;
    LPTSTR  lpGets;
    
    if ( (lpClip = funcClipGets(hWnd)) != NULL ){
        for ( lpGets = funcCRLFString(lpClip) ; *lpGets != TEXT('\0') ; lpGets++ ){
            printf( TEXT("%05u %s\r\n"), ++dwLine, lpGets );
            lpGets += lstrlen( lpGets );
        }
        // 使用後は必ず解放
        GlobalFree( lpClip );
        return 0;
    }
    printf( TEXT("クリップボードが開けないか、またはデータがありません。\n") );
    return 1;
}
  • lpString にダブル NULL に変換したい文字列を指定します。
  • 空行は削除されて改行コードを NULL 文字(\0)に置き換えます。
  • そして最後にもう一つの NULL 文字(\0)が追加されます。
  • つまり、最後は NULL 文字(\0)が 2 つ続きます。

実行結果(実行前)

1行目の文字列\r\n
2行目の文字列\r\n
3行目の文字列\r\n
\r\n
\r\n
6行目の文字列\r\n
\0

実行結果(実行後)

1行目の文字列\0
2行目の文字列\0
3行目の文字列\0
6行目の文字列\0
\0
  • 最後にもう一つの NULL 文字(\0)が追加されます。
  • つまり、最後は NULL 文字(\0)が 2 つ続く事になります。

注意事項

  • 改行がない場合は、バッファに\0分が1つ増えるため要注意。(funcDupStringで確保したなら安全)
  • lpString の文字列は funcCRLFString()関数の内部で NULL 文字(\0)を書き込み行単位で分離します。
  • よって LPCTSTR の文字列は渡せません。
  • 文字列内容を書き換えたくない場合は、一時バッファにコピーして、その文字列を渡します。

その他

  • funcCRLFString 関数は「マルチバイト文字セット」、「Unicode文字セット」の両方に対応しています。
  • 使用例のコンパイル時は printf 使用のため「マルチバイト文字セット」で行って下さい。
  • なお、使用例ではクリップボードの内容を行番号付きで表示します。

関連記事



コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 文字列バッファを行単位で取... | トップ | クリップボードの基本関数(ま... »
最新の画像もっと見る

コメントを投稿

便利ライブラリ関数」カテゴリの最新記事