2010-09-25 16 views
1
stack <char> stck; 
string str; 

stck.push('0'); 

str.append("test:"); 
//test: 
cout << str << endl; 

str.append(&stck.top()); 
//test:0═══════════════¤¤¤¤▌▌▌▌,╘╥XЕ┤ 
cout << str << endl; 

Pourquoi cela se produit-il?Strange comportement de pile/chaîne

Répondre

3

Maciej Hehl est correct à propos de pourquoi vous obtenez un comportement non désiré. Pour obtenir le comportement que vous souhaitez, vous devez ajouter le caractère lui-même, pas un pointeur vers lui. Vous avez raison de dire (dans votre commentaire à la réponse de Kalim) qu'il n'y a pas de dérogation de std::string::append qui prend juste char. Cependant, il y a un remplacement std::string::append(std::size_t, char), qui ajoute le caractère (deuxième argument) un certain nombre de fois (premier argument).

Ainsi, la manière correcte d'écrire ce que vous voulez serait:

str.append(1, stck.top()); // Append one copy of the character at the top of the stack 

Ou encore, il suffit d'utiliser la surcharge pour l'opérateur +=, qui accepte un char:

str += stck.top(); 
+0

grâce, il a travaillé ! – nawriuus

2

&stck.top() est une adresse du char qui se trouve au sommet de la pile. Le type de cette expression est char*.

La surcharge de méthode append, qui prend char* (en fait, la signature est string& append (const char* s);) attend le pointeur pour pointer vers le début d'une chaîne terminée par un octet nul et interprète l'argument de cette manière. Il ajoute le caractère pointé par l'argument, puis tous les caractères consécutifs de la mémoire, jusqu'au premier caractère nul. Il lit et copie une zone de la mémoire, qui n'appartient pas à la pile.