次の方法で共有


C++ の文字列リテラル

リテラル文字列は、二重引用符 (") で囲まれたソース文字セットからの 0 個以上の文字で構成されます。リテラル文字列は、全体で null で終わる文字列を形成する文字のシーケンスを表します。

リテラル文字列は、二重引用符 (")、円記号 (\)、または改行文字を除く、ソース文字セットの任意のグラフィック文字を含む可能性があります。これらには、C++ の文字定数 で説明されているのと同じエスケープ シーケンスが含まれる場合があります。

C++ の文字列には、以下の型があります。

  • char[n] の配列。ここで、文字列の末尾を示す終端の '\0**'** の場合、n は文字列の長さ (文字数) + 1 です。

  • ワイド文字列の wchar_t の配列。

文字列定数を変更した結果は未定義です。次に例を示します。

char *szStr = "1234";
szStr[2] = 'A';      // Results undefined

Microsoft 固有の仕様 →

場合によっては、実行可能ファイルの領域を節約するために同じ文字列リテラルを "プール" できます。文字列リテラルのプールでは、各参照が文字列リテラルの各インスタンスを指すのではなく、コンパイラにより、特定の文字列リテラルへのすべての参照がメモリ内の同じ場所を指します。/GF は文字列プールを有効にします。

END Microsoft 固有

文字列リテラルを指定すると、隣接する文字列が連結されます。したがって、この宣言:

char szStr[] = "12" "34";

次の宣言と同じです。

char szStr[] = "1234";

この隣接する文字列の連結により、複数の行にまたがる長い文字列を簡単に指定できます。

cout << "Four score and seven years "
        "ago, our forefathers brought forth "
        "upon this continent a new nation.";

前の例では、文字列全体 Four score and seven years ago, our forefathers brought forth upon this continent a new nation. がスプライスされます。この文字列は、行スプライスを使用して次のように指定することもできます:

cout << "Four score and seven years \
ago, our forefathers brought forth \
upon this continent a new nation.";

定数内のすべての隣接する文字列が連結された後、C の文字列処理関数に文字列の終わりを示すマーカーを提供するために、NULL 文字、'\0' が追加されます。

最初の文字列にエスケープ文字が含まれる場合、文字列の連結により意外な結果が生じる場合があります。次の 2 つの宣言を考えます。

char szStr1[] = "\01" "23";
char szStr2[] = "\0123";

szStr1 と szStr2 には同じ値が含まれていると仮定することは普通ですが、実際に含まれている値を次の図に示します。

エスケープと文字列の連結

エスケープと文字列の連結

Microsoft 固有の仕様 →

文字列リテラルの最大長は 16,384 (16K) バイトです。この制限は、char[]wchar_t[] 型の文字列に適用されます。文字列リテラルが二重引用符で囲まれた部分で構成されている場合、プリプロセッサはそれらの部分を単一の文字列に連結し、連結されている各行に対して合計バイト数に 1 バイトを追加します。

たとえば、1 行あたり 50 文字の 40 行 (2,000 文字) の文字列と、7 文字で構成される 1 行があり、各行は二重引用符で囲まれているとします。これは、最大で 2,007 バイトと終端の null 文字の 1 バイトを加算し、合計 2,008 バイトとなります。連結後は、最初の各 40 行の合計バイト数に余分な文字が追加されています。これは、合計で 2,048 バイトになります。(余分な文字は、最終的な文字列に書き込まれません)。ただし、行連結文字 (\) が二重引用符の代わりに使用されている場合、プリプロセッサは各行に余分な文字を追加しません。

END Microsoft 固有

文字の数をカウントし、終端の '\0' の場合は 1、wchar_t 型の場合は 2 を加算することによって文字列オブジェクトのサイズを決定します。

二重引用符 (") が文字列を囲むため、囲まれた二重引用符を表すには、エスケープ シーケンス (\") を使用します。単一引用符 (') は、エスケープ シーケンスを使用せずに表すことができます。円記号 (\) は、行の末尾に配置されている場合は行連結文字です。バックスラッシュを文字列内に表示するには、2 つのバックスラッシュ (\\) を入力する必要があります。(行連結の詳細については、『プリプロセッサ リファレンス』の「変換の段階」を参照してください)。

ワイド文字型の文字列 (wchar_t[]) を指定するには、開始の二重引用符の前に文字 L を指定します。次に例を示します。

wchar_t wszStr[] = L"1a1g";

文字定数」に示されたすべての正常なエスケープ コードは文字列定数で有効です。次に例を示します。

cout << "First line\nSecond line";
cout << "Error! Take corrective action\a";

エスケープ コードが 16 進数ではない最初の文字で終了するため、埋め込み 16 進数のエスケープ コードの文字列定数の仕様により、予期しない結果が生じる可能性があります。次の例では、文字 five と ASCII 5 を含む文字列リテラルの作成を意図しています。

"\x05five"

実際の結果は 6 進数値 5F (アンダースコアの ASCII コード) で、これに文字 ive が続きます。次の例では、目的の結果を得ることができます。

"\005five"     // Use octal constant.
"\x05" "five"  // Use string splicing.

参照

関連項目

C++ のリテラル