7
votes

Pourquoi ma chaîne n'est-elle pas imprimée?

J'ai du code que, dans sa forme complète la plus petite qui présente le problème (être un bon citoyen lorsqu'il s'agit de poser des questions), résume essentiellement les suivantes:

[]


3 commentaires

Vous devez inclure pour cela pour "travailler" de manière conforme, à la manière.


Bon point, comment est-ce même la compilation?


GCC (Ubuntu 4.4.3-4ubuntu5) 4.4.3 compile que sans erreur - peut-être que c'est juste pardonner. Dans tous les cas, l'ajout de chaîne n'aide pas, donc je vais l'ajouter à la question, donc nous sommes plus casher. Cependant, Xeo m'a frappé à ça, merci :-)


5 Réponses :


4
votes

Vous ne pouvez pas ajouter de pointeur de caractère et un entier comme celui-là (vous pouvez, mais cela ne fera pas ce que vous attendez).

Vous aurez besoin de convertir le x en une chaîne en premier. Vous pouvez soit le faire hors de bande de la bande C en utilisant la fonction ITOA pour convertir l'entier en une chaîne: p> xxx pré>

ou la voie STD avec un Sstream:

std::cout << text << x;


3 commentaires

Ne serait-il pas toujours dans des problèmes car x est de type int, pas de chaîne ou de caractère *?


Cela me donne [la valeur était ] (a pour tuyer à travers de -cb pour voir ce qui se passait là-bas.


Lorsque vous faites s + = x; il convertit entier 11 en caractères 11 et tente d'obtenir le caractère ASCII correspondant.



2
votes

C ++ ne concaténe pas les chaînes à l'aide de l'opérateur +. Il n'y a pas non plus d'auto-promotion des types de données à la chaîne.


0 commentaires

8
votes

"La valeur était:" est de type const caractère [12] . Lorsque vous y ajoutez un entier, vous référencez efficacement un élément de ce tableau. Pour voir l'effet, changez x sur 3 .

Vous devrez construire un std :: string explicitement. Encore une fois, vous ne pouvez pas concaténer un std :: string et un entier. Pour contourner ce problème, vous pouvez écrire dans un std :: ostringstream : xxx


10 commentaires

Dans ce cas, étant donné que le nombre est 11 et la longueur de la chaîne est 11, le pointeur résultant pointe directement sur le terminateur NULL.


C'est du type const char [12] , réellement.


Char [11] En réalité (je pense).


@paxdiablo: const Char [12] . Il est résilié à zéro implicitement.


@Gman: Merci, j'ai changé cela.


DÉSOLÉ 'COULAIS QUE VOUS ÊTES ÉCOUTE À QUE 12, je me suis malompté. Cependant, vous n'êtes pas vraiment dû au sujet du const . Bien qu'il soit indéfini d'essayer de les modifier, les littéraux de chaîne sont char , pas const caractère . Sauf les vastes qui ne sont pas char , mais je suis toujours sûr que ce ne sont pas const non plus, même si je ne les ai jamais utilisés. Pas que cela affecte mon uppote pour cette réponse :-)


ou alternativement, la déclaration peut être modifiée comme STD :: String S = String ("valeur était:") + x;


Il était utilisé pour être char [] , mais selon GLENMCCL.com/ansi_014. HTM Il a été décidé de le modifier en Const Char [] . Je ne sais pas si ce changement s'applique déjà ou si c'est pour la norme C ++ à venir.


@hype: Non, ça ne peut pas. Cela donne un pas de match pour 'opérateur +' dans std :: basic_string erreur.


@PAX: §2.13.4 / 1, C ++ 03: "Un littéral à chaîne ordinaire a le type" Tableau de N Const Char "et une durée de stockage statique (3.7), où n est la taille de la chaîne"



2
votes

en C / C ++, vous ne pouvez pas ajouter un entier à un réseau de caractères à l'aide de l'opérateur + car un Char TRAY décrit sur un pointeur. Pour ajouter un int à une chaîne , utilisez ostringstream : xxx


0 commentaires

4
votes

Amusant :) C'est ce que nous payons pour la compatibilité C et le manque d'une chaîne intégrée .

Quoi qu'il en soit, je pense que la façon la plus lisible de le faire serait: xxx

parce que le type lexical_cast est std :: string ici, la surcharge droite de + sera sélectionné.


0 commentaires