ホームページ >バックエンド開発 >C++ >C で文字を文字列に連結すると、予期しない出力が発生する場合があるのはなぜですか?

C で文字を文字列に連結すると、予期しない出力が発生する場合があるのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-25 07:35:28272ブラウズ

Why Does Concatenating a Character to a String in C   Sometimes Lead to Unexpected Output?

C での文字列リテラルと文字リテラルの連結

C では、文字列と文字の連結に演算子を使用できます。ただし、この動作は関係するオペランドのタイプによって異なります。

次のコードを考えてみましょう。

<code class="cpp">string str = "ab" + 'c';
cout << str << endl;</code>

このコードは、期待どおりに出力「abc」を生成します。これは、文字列リテラル「ab」が自動的に const char* ポインターに変換されるためです。文字リテラル「c」は整数値に昇格され、文字列リテラルのアドレスに追加されます。結果は、文字 "abc" を含む新しい文字列になります。

ただし、次の代替案を検討してください。

<code class="cpp">char ch = 'c';
string str1 = "ab";
string str2 = str1 + ch;
cout << str2 << endl;</code>

このコードでは、予期しない出力 "ed" が生成されます。

この動作を理解するには、まず文字列 str1 が const char* ではなく string 型であることを確認する必要があります。文字列に ch という文字を追加すると、コンパイラは文字列オブジェクトに対してオーバーロードされた演算子を使用しようとします。ただし、string と char には演算子のオーバーロードはありません。

この曖昧さを解決するために、コンパイラは ch を整数に昇格させ、最初の例のように加算を実行します。ただし、結果のアドレスは文字列 str1 に割り当てられたメモリを超えているため、未定義の動作が発生します。 NULL 文字が検出されるまで文字はこのアドレスから取得され、予期しない出力が発生します。

この動作を防ぐには、'c' を追加する前に "ab" を文字列に明示的にキャストできます:

<code class="cpp">string str = std::string("ab") + 'c';</code>

代わりに、連結演算子 =:

<code class="cpp">string str = "ab";
str += 'c';</code>

を使用することもできます。これらのアプローチは両方とも、結果が有効な文字列であることを保証します。

以上がC で文字を文字列に連結すると、予期しない出力が発生する場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。