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

Barbara Streisand
リリース: 2024-10-25 07:35:28
オリジナル
206 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!