22

文字列にプレフィックスを付ける C# の @ 記号に相当する C++ は何ですか? シンボルを自動的にエスケープするには?

例: var howManySlashesAreThereIn = @"\\\\\\";

4

3 に答える 3

36

C++11 では、生の文字列リテラルを使用できます。

std::string s = R"(This\is\a\raw\string\literal)";

std::string s = R"*(This \one contains \a )", which would normally end the string)*";

ここにC++11 FAQの単語とリファレンスがあります。

于 2012-05-09T04:53:32.473 に答える
9

あなたはC++の「生の文字列」機能を探していますが、それはかなり最近追加されたものです(C++ 11だと思います)。

std::string howManySlashesAreThereIn = R"(\\\\\\)";

これは C++11 標準で文書化されて2.14.5 String lieteralsいますが、その本はあなたにとって少し乾燥しているかもしれないので、Google で検索することをお勧めし"raw string" c++ます。

のようなエスケープ倍増モンスターを取り除くだけでなく、次のように「文字を追加して隣接する文字列を結合する」トリック"\\\\nasbox\\sharename\\downloads\\super_sekrit_stuff"をバイパスすることもできます。\n

htmlString =
    "<HTML>\n"
      "<HEAD>\n"
        "<TITLE>My page</TITLE>\n"
        "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=utf-8\">\n"
      "</HEAD>\n"
      "<BODY LINK=\"#0000ff\" VLINK=\"#800080\" BGCOLOR=\"#ffffff\">\n"
        "<P> </P>\n"
        "<PRE>\n";

より読みやすいものに変換します( 2番目のバリアントのスペースのためにまったく同じではありませんが、この場合追加されたスペースを無視するため、HTMLでは完全に問題ありません):

htmlString = R"xyzzy(
    <HTML>
      <HEAD>
        <TITLE>My page</TITLE>
        <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
      </HEAD>
      <BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#ffffff">
        <P> </P>
        <PRE>
    )xyzzy";
于 2012-05-09T04:53:28.113 に答える
4

C++11rawは、少なくともいくらか似ている文字列リテラルを追加します。

R"(This is a raw literal)";

これらは、次のような正規表現に特に役立ちます。

R"@(\w+\d*)@"

...これは、従来のリテラルとして次のようになります。

"\\w+\\d*"

違いはそれほど大きくありませんが、特に長い正規表現では違いが生じる可能性があります。

于 2012-05-09T04:54:25.537 に答える