2012-01-16 4 views
0

J'ai ce petit programme.Comportement étrange de std :: string

#include <iostream> 
#include <string> 
int main() 
{ 
    std::string st = ('='+"10"); 
    std::cout<<st<<"-"<<st.c_str(); 
    return 0;  
} 

Quel type de sortie attendez-vous sans l'exécuter?

Je reçois: -

Je suis en cours d'exécution dans ces problèmes lors de l'utilisation boost :: bibliothèque esprit et qui passe sa sortie autour comme c-strings.

Ai-je raté quelque chose? J'utilise gcc 4.6.1 (ubuntu 10.10).

+1

Notez que les littéraux de chaîne adjacents sont combinés par le compilateur: '" = "" 10 "' devient '" = 10 "' (C++ 03, § 2.13.4-3). – outis

Répondre

3

Ce:

'=' + "10" 

ne probablement pas ce que vous attendez. Plutôt que de concaténer, il va "ajouter" (arithmétiquement) la valeur "ASCII" de '=' à un pointeur vers la chaîne littérale "10", qui est un dépassement de tampon et invoque donc un comportement indéfini.

Si vous exécutez votre programme sous valgrind, vous le verrez probablement se plaindre à ce sujet.

Au lieu de cela, essayez:

std::string st = "="; 
st += "10"; 
+0

C'est bizarre! Je pensais 'st + =" 10 "' se développe comme 'st = st +" 10 "' – Dilawar

+3

@Dilawar: ''='' est un caractère, pas une chaîne. En outre, l'ajout de chaînes de caractères ne les concaténera pas. Par conséquent, l'utilisation de John de '+ ='. – outis

+0

Vous avez raison, ces deux choses sont équivalentes. Mais notez que j'ai écrit "=" plutôt que '=', et j'ai ajouté le littéral de chaîne C "10" à une chaîne std ::, alors que vous l'avez ajouté à un caractère. –

1

Essayez plutôt:

#include <iostream> 
#include <string> 
int main() 
{ 
    std::string st = ('='+std::string("10")); 
    std::cout<<st<<"-"<<st.c_str(); 
    return 0; 
} 

Remarque "10" est un const char* (pointeur). Ajouter à cela va incrémenter le pointeur en utilisant l'arithmétique standard et ne pas concaténer une chaîne.

+0

Je pense que le compilateur devrait déclencher un avertissement. Je compilais avec -Wall. – Dilawar

+0

Il n'y a pas de raison pour un avertissement, l'incrémentation d'un pointeur est une pratique courante en C/C++ et est valide en soi. Le problème est que vous créez une adresse invalide et la transmettez au constructeur de la chaîne, ce que le compilateur n'a aucun moyen de connaître. –

+0

@TimGee: pour être juste, le compilateur pourrait certainement avertir de '=' + "10" (en incrémentant un pointeur sur un littéral de chaîne de plus de la longueur de la chaîne). Je ne serai pas surpris si aucun compilateur ne le fait encore, mais ils pourraient absolument. –

Questions connexes