Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Menggabungkan Watak kepada Rentetan dalam C Kadangkala Membawa kepada Keluaran Tidak Dijangka?

Mengapa Menggabungkan Watak kepada Rentetan dalam C Kadangkala Membawa kepada Keluaran Tidak Dijangka?

Barbara Streisand
Barbara Streisandasal
2024-10-25 07:35:28207semak imbas

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

Menggabungkan Rentetan dan Aksara Huruf dalam C

Dalam C , pengendali boleh digunakan untuk rentetan dan penggabungan aksara. Walau bagaimanapun, tingkah laku ini berbeza-beza bergantung pada jenis operan yang terlibat.

Pertimbangkan kod berikut:

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

Kod ini menghasilkan output "abc" seperti yang diharapkan. Ini kerana rentetan literal "ab" ditukar secara automatik kepada penunjuk const char*. Aksara literal 'c' dinaikkan pangkat kepada nilai integer dan ditambah pada alamat literal rentetan. Hasilnya ialah rentetan baharu yang mengandungi aksara "abc".

Walau bagaimanapun, pertimbangkan alternatif ini:

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

Kod ini menghasilkan output "ed" yang tidak dijangka.

Untuk memahami tingkah laku ini, kita perlu perhatikan dahulu bahawa rentetan str1 ialah rentetan jenis, bukan const char*. Apabila kita menambah aksara ch pada rentetan, pengkompil cuba menggunakan operator terlampau beban untuk objek rentetan. Walau bagaimanapun, tiada beban operator untuk rentetan dan char.

Untuk menyelesaikan kekaburan ini, pengkompil mempromosikan ch kepada integer dan melakukan penambahan seperti dalam contoh pertama. Walau bagaimanapun, kerana alamat yang terhasil menghala melepasi memori yang diperuntukkan untuk rentetan str1, kita mendapat tingkah laku yang tidak ditentukan. Aksara diambil dari alamat ini sehingga aksara nol ditemui, menghasilkan output yang tidak dijangka.

Untuk mengelakkan tingkah laku ini, kita boleh menghantar "ab" secara eksplisit pada rentetan sebelum menambah 'c':

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

Sebagai alternatif, kita boleh menggunakan operator penggabungan =:

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

Kedua-dua pendekatan ini memastikan bahawa hasilnya adalah rentetan yang sah.

Atas ialah kandungan terperinci Mengapa Menggabungkan Watak kepada Rentetan dalam C Kadangkala Membawa kepada Keluaran Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn