web-dev-qa-db-ja.com

二重引用符を文字列リテラルに入れる方法は?

printf()ステートメントを使用して次の出力を作成しました。

_printf("She said time flies like an arrow, but fruit flies like a banana.");
_

しかし、実際の引用を二重引用符で囲みたいので、出力は

彼女は「時間は矢のように飛びますが、果物はバナナのように飛びます」と言いました。

printf()ステートメントで文字列リテラルをラップするために使用される二重引用符を妨げることなく。

これどうやってするの?

18
kevthanewversi

引用符をバックスラッシュでエスケープします。

printf("She said \"time flies like an arrow, but fruit flies like a banana\"."); 

文字列リテラルで使用できる特別な エスケープ文字 があり、これらは先頭のバックスラッシュで示されます。

54
Mark Byers

ありがたいことに、C++ 11では、生の文字列リテラルを使用するより楽しいアプローチもあります。

printf("She said \"time flies like an arrow, but fruit flies like a banana\".");

になる:

printf(R"(She said "time flies like an arrow, but fruit flies like a banana".)");

開始引用符の後、および終了引用符の前の括弧の追加に関しては、最大16文字のほぼ任意の組み合わせにできることに注意してください。これにより、文字列自体に組み合わせが存在する状況を回避できます。具体的には:

スペース、左括弧(、右括弧)、バックスラッシュ\、および水平タブ、垂直タブ、フォームフィード、および改行を表す制御文字を除く、基本ソース文字セットのメンバー」(N3936§2.14.5[ Lex.string] grammar)および "最大16文字"(§2.14.5/ 2)

この些細な文をどれだけ明確にするかは議論の余地がありますが、HTMLやJSONなどのフォーマットされた文字列で使用すると、間違いなくはるかに明確になります。

13
pjcard