47

\文字列リテラルのエスケープ文字の規則は何ですか? エスケープされるすべての文字のリストはありますか?

特に、\gedit で文字列リテラルを使用し、その後に任意の 3 つの数字を続けると、色が異なります。

std::string文字の後に0ヌル文字 ( \0) が続き、その後に文字0. 0ただし、構文の強調表示により、文字の後にヌル文字 ( \00、別名) が続く、つまり 2 文字のみのようなものが作成される可能性があることが警告されました\0

この1つの問題だけを解決するには、これが最善の方法ですか?

std::string ("0\0" "0", 3)  // String concatenation 

また、一般的に文字列リテラルでエスケープ文字が何をするかについての参照はありますか? たとえば、'\a' とは何ですか?

4

6 に答える 6

82

制御文字:

(16 進コードは、ASCII 互換の文字エンコーディングを想定しています。)

  • \a= \x07= アラート (ベル)
  • \b= \x08= バックスペース
  • \t= \x09= 水平タブ
  • \n= \x0A= 改行 (または改行)
  • \v= \x0B= 垂直タブ
  • \f= \x0C= フォーム フィード
  • \r= \x0D= 改行
  • \e= \x1B= エスケープ (非標準の GCC 拡張機能)

句読点:

  • \"= 引用符 ( にはバックスラッシュは必要ありません'"')
  • \'= アポストロフィ ( にはバックスラッシュは必要ありません"'")
  • \?= 疑問符 (トリグラフを避けるために使用)
  • \\= バックスラッシュ

数字参照:

  • \+ 8 進数 3 桁まで
  • \x+ 任意の数の 16 進数
  • \u+ 4 桁の 16 進数 (Unicode BMP、C++11 の新機能)
  • \U+ 8 桁の 16 進数 (Unicode アストラル プレーン、C++11 の新機能)

\0= \00= \000= null 文字の 8 進エスケープ

の後に実際の数字が必要な場合は\0、はい、文字列連結をお勧めします。リテラルの部分間の空白はオプションであるため、 と書くことができることに注意してください"\0""0"

于 2012-04-19T01:43:08.677 に答える
4

\0 の後に他の数字が続く場合、8 進数のエスケープ シーケンスとして解釈されるため、\00 は 1 つの文字として解釈されます。(少なくとも C では、\0 は技術的には 8 進数のエスケープ シーケンスでもあります)。

あなたがやっている方法:

std::string ("0\0" "0", 3)  // String concatenation 

このバージョンのコンストラクターは char 配列を取るため、機能します。"0\0" "0" を const char* として渡そうとすると、それは C 文字列として扱われ、ヌル文字まですべてがコピーされます。

エスケープ シーケンスの一覧を次に示します。

于 2012-04-19T01:29:05.170 に答える
4

\aベル/アラート文字で、一部のシステムではサウンドをトリガーします。\nnn、8 進数で任意の ASCII 文字を表します。ただし、\0は、何があってもヌル文字を表すという点で特別です。

元の質問に答えるには、次のように「0」文字もエスケープできます。

std::string ("\060\000\060", 3);

(ASCII '0' は 8 進数で 60 であるため)

MSDNのドキュメントには、 cppreferenceと同様に、これに関するかなり詳細な記事があります。

于 2012-04-19T01:26:01.810 に答える
1

コメントとしてこのようなものを残しましたが、この方法について言及している回答がないため、おそらくもっと可視性が必要だと思います。

std::string一般に非表示文字 (特に埋め込まれた null 文字) を使用してa を初期化するために私が好む方法は、初期化子リストの C++11 機能を使用することです。

std::string const str({'\0', '6', '\a', 'H', '\t'});

使用している文字数をエラーが発生しやすい手動でカウントする必要がないため、後でどこかに「\013」を挿入したい場合でも、すべてのコードが引き続き機能します。 . また、誤って間違ったエスケープ シーケンスを使用するという問題を完全に回避します。

唯一の欠点は、これらすべての余分な'文字,です。

于 2012-11-30T16:47:07.093 に答える
0

ユーザー定義リテラルの魔法により、これに対するさらに別の解決策があります。C++14 ではstd::stringリテラル演算子が追加されました。

using namespace std::string_literals;
auto const x = "\0" "0"s;

'\0' 文字 (null) の後に '0' 文字 (数字のゼロ) が続く、長さ 2 の文字列を作成します。initializer_list<char> コンストラクターのアプローチよりも多かれ少なかれ明確かどうかはわかりませんが、少なくとも',文字を取り除きます。

于 2016-07-30T01:44:35.867 に答える