8
votes

Concaténation de chaîne littérale C ++

J'ai une question sur la concaténation des chaînes en C ++.

ed before SaveGraphicsState
abc


0 commentaires

8 Réponses :


2
votes
string str = string("ab") + "c";

3 commentaires

Ou: string str2 = str1; str2 + = ch;


-1 "AB" + 'c' est pas équivalent à "AB" ['C'] . Le premier est un pointeur, ce dernier est un char.


@ROB: Merci. Corrigée.



10
votes

Votre pensée concernant la première ligne est correcte, c'est précisément ce qui se passe.

Il n'y a pas d'opérateur + par défaut pour les chaînes littéraires telles que "AB" donc ce qui se passe est le compilateur prend cette (comme une chaîne de style C) et utilise Le pointeur COR * qui pointe vers le littéral. Il prend ensuite votre caractère littéral 'c' et le promeut à int avec une certaine valeur. Cet int est ensuite ajouté à l'adresse du littéral et utilisé comme c-string. Étant donné que vous avez dépassé l'espace alloué à votre chaîne littérale, les résultats sont indéfinis et il suffit d'imprimer des caractères de l'adresse obtenue jusqu'à ce qu'elle ait trouvé une null.

Si vous souhaitez créer la chaîne en une seule photo, vous pouvez aider le compilateur à déterminer que vous vouliez convertir en chaîne d'abord avec une distribution: std :: string str = std :: String ("AB") + 'C'; . Alternativement (comme le montre un commentaire séparé) le faire avec une concaténation qui peut être meilleure ou non performante. Utilisez ce qui semble plus clair dans votre cas: std :: string str = "ab"; str + = 'c'; .

Dans le second cas, vous avez déjà créé une chaîne (code> et String a un opérateur surchargé + qui fait la concaténation intuitive.


1 commentaires

La réponse de Mark est correcte. Notez cependant que vous pouvez écrire "AB" "C" sans intervenant +, et le préprocesseur les concaténera pour vous.



2
votes

Votre hypothèse est correcte, à l'exception du littéral de la chaîne n'est pas sur la pile, c'est dans un emplacement spécifique à une boîte à outils en mémoire, souvent dans une section en lecture seule.


0 commentaires

0
votes

"AB" est un const char * . 'c' est un char . Je suppose que 'c' est converti en un entier, ledit entier est ajouté à l'adresse de "AB" , et le pointeur résultant est transmis à std :: String constructeur. Vous avez de la chance que cela ne s'écrase pas malablement.

Voir les autres réponses pour savoir comment faire la concaténation correctement.


0 commentaires

1
votes

Surcharge de l'opérateur ne fonctionne que lorsque au moins l'un des paramètres de l'opérateur surchargé est un type défini par l'utilisateur (c'est-à-dire une instance de classe), de sorte que l'opérateur + ne peut pas être surchargé pour ajouter une chaîne de caractères et un caractère. et faire quelque chose de sensible. Au mieux, vous obtiendrez le pointeur arithmétique étant effectué - presque certainement pas ce que vous voulez. Le travail habituel pour cela est une conversion explicite:

string s = string( "foo" ) + "bar";    // s will contain "foobar"


0 commentaires

0
votes

Je pense string str = "AB" + 'c'; fonctionne quelque chose comme: xxx


0 commentaires

1
votes
stringstream ss;
ss << "ab" << 'c';

0 commentaires

0
votes

Ceci est construit en C ++: xxx

sortie: xxx


0 commentaires