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

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

文字列バッファを行単位で取得 - funcLineString()

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

文字列バッファを行単位で取得するには次の手順で行います。(戻る)

  1. 文字列バッファの先頭位置を記憶する(lpSeek)
  2. 記憶位置の先頭を lpGets に保存する(lpGets)
  3. 記憶位置から改行まで移動し NULL 文字を書き込む
  4. 保存した lpGets を返す
  5. lpString に NULL が渡されたら(2)へ移動し繰り返す
  6. 記憶位置が 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 使用のため「マルチバイト文字セット」で行って下さい。
  • なお、使用例ではクリップボードの内容を行番号付きで表示します。

関連記事



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

コメントを投稿

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