2009-09-02 5 views
2

J'ai travaillé avec le code de quelqu'un d'autre et j'ai remarqué que sur toutes les utilisations d'ostringsteam, ils ont l'habitude d'ajouter explicitement std::ends.ostringstream et se termine

C'est quelque chose que je n'ai jamais fait et je n'ai jamais rencontré de problème.

Il ne semble pas, mais devrait std::ends faire une différence dans le code suivant?

ostringstream message; 
message << "Hello world, version " << 2 /* << std::ends ??? */; 
printf("%s\n", message.str().c_str()); 
+0

Y a-t-il une chance qu'il ait typé 'std :: endl'? –

+0

@litb - non Je pense que l'intention est définitivement terminée et cela se produit plusieurs fois – markh44

+1

Votre printf est faux, il manque une chaîne de format. –

Répondre

10

std::ends est un non-sens Adjonction ici depuis stringstream « s c_str renvoie une fin null-char*. La même chose était pas le cas pour le strstream (maintenant obsolète) où l'ajout de std::ends était nécessaire. Je crois que l'auteur n'était tout simplement pas au courant de ce changement de comportement.

+0

+1 bonne réponse. Il y a quelques scénarios pour stringstream où 'ends' peut être utile cependant: http://stackoverflow.com/questions/624260/how-to-reuse-an-ostringstream/624291#624291 –

+2

Nonobstant le lien ci-dessus où les extrémités sont utiles, ils peuvent être dangereux dans la mesure où ils ajoutent un caractère «supplémentaire» là où on n'en attendait pas. Mon collègue s'est demandé pourquoi sa chaîne construite par chaîne strings n'était pas identique à celle de la base de données, et c'était parce qu'elle avait un caractère \ 0 incorporé. – sdg

2

Il ne devrait pas, c_str() renvoie la chaîne terminée par NUL, de toute façon.

Questions connexes