web-dev-qa-db-ja.com

C ++文字列リテラルのエスケープ文字のルール

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

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

文字std::stringにヌル文字(0)、文字\0が続くリテラルから構築された0を作成しようとしていました。ただし、構文の強調表示により、0の後にヌル文字(\00、別名\0)が続く文字(つまり、2文字のみ)が作成される可能性があります。

この1つの問題の解決策として、これが最善の方法です。

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

そして、一般的な文字列リテラルでエスケープ文字が行うことについての参照はありますか?たとえば、「\ a」とは何ですか?

39
David Stone

制御文字:

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

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

句読点:

  • \" =引用符('"'にはバックスラッシュは不要)
  • \' =アポストロフィ("'"にはバックスラッシュは不要)
  • \? =疑問符(3文字表記を避けるために使用)
  • \\ =バックスラッシュ

数値参照:

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

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

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

59
dan04

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

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

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

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

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

4
jli

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

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

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

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

エスケープシーケンスのリスト です。

4
mgiuffrida

私はこのようなものをコメントとして残しましたが、答えはどれもこの方法に言及していないので、おそらくもっと可視性が必要だと感じています:

std::stringを一般的な非印刷文字(および特に埋め込まれたヌル文字)で初期化するために私が好む方法は、初期化リストのC++ 11機能を使用することです。

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

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

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

1
David Stone

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

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

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

0
David Stone