cppBuilder
stringOperation
trap
CRLF
#migrated

C++ Builder XE4, 10.2 Tokyo > String > 行末のCRLFを削除する方法 > Trim() or StringReplace()

動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)

実装内容

String withCRLF = L"Hellow World\r\n";

のような文字列からCR,LFを削除したい。

StringReplace()を使う方法を従来使っていたが、Trim()でも可能とのこと。

https://stackoverflow.com/questions/6424510/removing-a-from-delphi-string

answered Jun 9 '16 at 10:12
jcfaria

code

Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    String withCRLF = L"Hellow World\r\n";

    // 1.
    Memo1->Lines->Add(L"===with CRLF");
    Memo1->Lines->Add(withCRLF);
    Memo1->Lines->Add(withCRLF);

    // 2.
    Memo1->Lines->Add(L"===without CRLF using Trim()");
    String woCRLF = Trim(withCRLF);
    Memo1->Lines->Add(woCRLF);
    Memo1->Lines->Add(woCRLF);

    // 3.
    Memo1->Lines->Add(L"===without CRLF using StringReplace");
    String wrk = StringReplace(withCRLF, L"\r\n", L"", TReplaceFlags()<<rfReplaceAll);
    Memo1->Lines->Add(wrk);
    Memo1->Lines->Add(wrk);
}
//---------------------------------------------------------------------------

qiita.png

Trim

ビルトインヘルプによると

System.UnicodeString.Trim
...
説明
新しい UnicodeString を、前後のスペースおよび制御文字を除いて返します。

制御文字であるCR, LFを除くことができる。

Trim() or StringReplace()?

  • Trim()
    • 簡潔ではある
    • ソースを読んだ時に「意図」が分かりにくい
      • 前後のスペースを消したいのか
      • CR, LFを消したいのか
  • StringReplace()
    • 簡潔でない
    • ソースを読んだ時に「意図」が分かる
      • CR, LFを消す

Trim()を使う場合は、コメントと合わせて使う方が良いように思う。

String wrk = Trim(srcStr); // 行末の<CR><LF>を削除

コメントなしの場合、意図が分からずに間違った実装に気づかない。

別途、「前後の空白が削除される」ことが意図に反するかどうかも注意点である。

1つの関数で2種類の内容を実行している関数は、意図が分かりにくいために失敗を誘発する。
また、関数のコール文においての可読性が低下する。