Maison  >  Article  >  développement back-end  >  Pourquoi la concaténation d’un caractère à une chaîne en C conduit-elle parfois à une sortie inattendue ?

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

Barbara Streisand
Barbara Streisandoriginal
2024-10-25 07:35:28207parcourir

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>

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>

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>

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

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

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!

Déclaration:
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