Maison > développement back-end > C++ > le corps du texte

Pourquoi la concaténation d'un caractère à une chaîne en C conduit-elle parfois à une sortie inattendue ?

Barbara Streisand
Libérer: 2024-10-25 07:35:28
original
206 Les gens l'ont consulté

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

Concaténation de chaînes et de caractères littéraux en C

En C , l'opérateur peut être utilisé pour la concaténation de chaînes et de caractères. Cependant, ce comportement varie en fonction du type d'opérandes impliqués.

Considérez le code suivant :

<code class="cpp">string str = "ab" + 'c';
cout << str << endl;</code>
Copier après la connexion

Ce code produit la sortie "abc" comme prévu. En effet, la chaîne littérale « ab » est automatiquement convertie en un pointeur const char*. Le caractère littéral « c » est promu en valeur entière et ajouté à l’adresse de la chaîne littérale. Le résultat est une nouvelle chaîne qui contient les caractères "abc".

Cependant, considérez cette alternative :

<code class="cpp">char ch = 'c';
string str1 = "ab";
string str2 = str1 + ch;
cout << str2 << endl;</code>
Copier après la connexion

Ce code produit la sortie inattendue "ed".

Pour comprendre ce comportement, il faut d'abord observer que la chaîne str1 est de type string, et non const char*. Lorsque nous ajoutons le caractère ch à la chaîne, le compilateur essaie d'utiliser l'opérateur surchargé pour les objets chaîne. Cependant, il n'y a pas de surcharge d'opérateurs pour string et char.

Pour résoudre cette ambiguïté, le compilateur promeut ch en entier et effectue l'addition comme dans le premier exemple. Cependant, puisque l'adresse résultante pointe au-delà de la mémoire allouée pour la chaîne str1, nous obtenons un comportement indéfini. Les caractères sont récupérés à partir de cette adresse jusqu'à ce qu'un caractère nul soit rencontré, ce qui entraîne une sortie inattendue.

Pour éviter ce comportement, nous pouvons explicitement convertir "ab" en chaîne avant d'ajouter "c" :

<code class="cpp">string str = std::string("ab") + 'c';</code>
Copier après la connexion

Alternativement, nous pouvons utiliser l'opérateur de concaténation =:

<code class="cpp">string str = "ab";
str += 'c';</code>
Copier après la connexion

Ces deux approches garantissent que le résultat est une chaîne valide.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!