文字列リテラルのエスケープ文字\
のルールは何ですか?エスケープされているすべての文字のリストはありますか?
特に、geditの文字列リテラルで\
を使用し、それに3つの数字を続けると、色が異なります。
文字std::string
にヌル文字(0
)、文字\0
が続くリテラルから構築された0
を作成しようとしていました。ただし、構文の強調表示により、0
の後にヌル文字(\00
、別名\0
)が続く文字(つまり、2文字のみ)が作成される可能性があります。
この1つの問題の解決策として、これが最善の方法です。
std::string ("0\0" "0", 3) // String concatenation
そして、一般的な文字列リテラルでエスケープ文字が行うことについての参照はありますか?たとえば、「\ a」とは何ですか?
制御文字:
(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"
と書くことができます。
\a
はベル/アラート文字で、一部のシステムではサウンドをトリガーします。 \nnn
は、任意のASCII 8進数の文字を表します。ただし、\0
は、何があってもヌル文字を表すという点で特別です。
元の質問に答えるには、次のように「0」文字をエスケープすることもできます。
std::string ("\060\000\060", 3);
(ASCII '0'は8進数で60であるため)
MSDNドキュメント には、これに関するかなり詳細な記事があります cppreference
\ 0の後に他の数字が続く場合、8進エスケープシーケンスとして解釈されるため、\ 00は単一の文字として解釈されます。 (\ 0は技術的には少なくともCでは8進数のエスケープシーケンスです)。
あなたがそれをやっている方法:
std::string ("0\0" "0", 3) // String concatenation
このバージョンのコンストラクターはchar配列を受け取るため、機能します。 const char *として "0\0" "0"を渡そうとすると、C文字列として扱われ、null文字まですべてがコピーされます。
エスケープシーケンスのリスト です。
私はこのようなものをコメントとして残しましたが、答えはどれもこの方法に言及していないので、おそらくもっと可視性が必要だと感じています:
std::string
を一般的な非印刷文字(および特に埋め込まれたヌル文字)で初期化するために私が好む方法は、初期化リストのC++ 11機能を使用することです。
std::string const str({'\0', '6', '\a', 'H', '\t'});
使用している文字数をエラーが発生しやすい手動カウントを実行する必要がないため、後で途中に「\ 013」を挿入したい場合は、すべてのコードが引き続き機能します。また、誤って誤ったエスケープシーケンスを使用する問題を完全に回避します。
唯一の欠点は、これらの余分な'
および,
文字すべてです。
ユーザー定義リテラルの魔法により、これに対するさらに別の解決策があります。 C++ 14はstd::string
リテラル演算子を追加しました。
using namespace std::string_literals;
auto const x = "\0" "0"s;
'\ 0'文字(null)の後に '0'文字(数字のゼロ)が続く、長さ2の文字列を構築します。 initializer_list<char>
コンストラクターアプローチ よりも明確かどうかはわかりませんが、少なくとも'
および,
文字は削除されます。