int i = 4;
string text = "Player ";
cout << (text + i);
Je voudrais qu'il imprime Player 4
.
Ce qui précède est évidemment faux mais cela montre ce que j'essaie de faire ici. Y a-t-il un moyen facile de faire cela ou dois-je commencer à ajouter de nouveaux includes?
Avec C++ 11, vous pouvez écrire:
#include <string> // to use std::string, std::to_string() and "+" operator acting on strings
int i = 4;
std::string text = "Player ";
text += std::to_string(i);
Eh bien, si vous utilisez cout, vous pouvez simplement écrire le nombre entier directement dessus, comme dans
_std::cout << text << i;
_
La manière C++ de convertir toutes sortes d'objets en chaînes est de string streams . Si vous n'en avez pas, créez-en un.
_#include <sstream>
std::ostringstream oss;
oss << text << i;
std::cout << oss.str();
_
Alternativement, vous pouvez simplement convertir l'entier et l'ajouter à la chaîne.
_oss << i;
text += oss.str();
_
Enfin, les bibliothèques Boost fournissent boost::lexical_cast
, qui encapsule la conversion en chaîne avec une syntaxe similaire à celle utilisée pour les conversions de types intégrées.
_#include <boost/lexical_cast.hpp>
text += boost::lexical_cast<std::string>(i);
_
Cela fonctionne également dans l’inverse, c’est-à-dire pour analyser les chaînes.
printf("Player %d", i);
(Réduisez ma réponse autant que vous le souhaitez; je déteste toujours les opérateurs d'E/S C++.)
:-P
Celles-ci fonctionnent pour les chaînes générales (au cas où vous ne voudriez pas sortir dans un fichier/console, mais le stocker pour une utilisation ultérieure ou autre chose).
boost.lexical_cast
MyStr += boost::lexical_cast<std::string>(MyInt);
Flux de chaîne
//sstream.h
std::stringstream Stream;
Stream.str(MyStr);
Stream << MyInt;
MyStr = Stream.str();
// If you're using a stream (for example, cout), rather than std::string
someStream << MyInt;
Pour l'enregistrement, vous pouvez également utiliser un std::stringstream
si vous voulez créer la chaîne avant qu'elle ne soit réellement affichée.
cout << text << " " << i << endl;
Votre exemple semble indiquer que vous souhaitez afficher la chaîne suivie d'un entier, auquel cas:
string text = "Player: ";
int i = 4;
cout << text << i << endl;
fonctionnerait bien.
Toutefois, si vous stockez les emplacements de chaîne ou que vous les distribuez, et que vous le fassiez fréquemment, vous pouvez bénéficier d'une surcharge de l'opérateur d'addition. Je démontre ceci ci-dessous:
#include <sstream>
#include <iostream>
using namespace std;
std::string operator+(std::string const &a, int b) {
std::ostringstream oss;
oss << a << b;
return oss.str();
}
int main() {
int i = 4;
string text = "Player: ";
cout << (text + i) << endl;
}
En fait, vous pouvez utiliser des modèles pour rendre cette approche plus puissante:
template <class T>
std::string operator+(std::string const &a, const T &b){
std::ostringstream oss;
oss << a << b;
return oss.str();
}
Maintenant, tant que l'objet b
a une sortie de flux définie, vous pouvez l'ajouter à votre chaîne (ou au moins une copie de celle-ci).
Une autre possibilité est Boost.Format :
#include <boost/format.hpp>
#include <iostream>
#include <string>
int main() {
int i = 4;
std::string text = "Player";
std::cout << boost::format("%1% %2%\n") % text % i;
}
Voici un petit exemple de conversion/ajout fonctionnel, avec du code dont j'avais besoin auparavant.
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
int main(){
string str;
int i = 321;
std::stringstream ss;
ss << 123;
str = "/dev/video";
cout << str << endl;
cout << str << 456 << endl;
cout << str << i << endl;
str += ss.str();
cout << str << endl;
}
la sortie sera:
/dev/video
/dev/video456
/dev/video321
/dev/video123
Notez que dans les deux dernières lignes, vous enregistrez la chaîne modifiée avant son impression et vous pouvez l'utiliser ultérieurement si nécessaire.
Pour mémoire, vous pouvez également utiliser la classe QString
de Qt:
#include <QtCore/QString>
int i = 4;
QString qs = QString("Player %1").arg(i);
std::cout << qs.toLocal8bit().constData(); // prints "Player 4"
cout << text << i;
Une méthode ici consiste à imprimer directement le résultat si cela est nécessaire à votre problème.
cout << text << i;
Sinon, l’une des méthodes les plus sûres consiste à utiliser
sprintf(count, "%d", i);
Et puis copiez-le dans votre chaîne "text".
for(k = 0; *(count + k); k++)
{
text += count[k];
}
Ainsi, vous avez votre chaîne de sortie requise
Pour plus d'informations sur sprintf
, suivez: http://www.cplusplus.com/reference/cstdio/sprintf
cout << "Player" << i ;
cout << text << i;
L'opérateur <<
pour ostream renvoie une référence à ostream. Vous pouvez donc continuer à chaîner les opérations <<
. Autrement dit, ce qui précède est fondamentalement le même que:
cout << text;
cout << i;
cout << text << " " << i << endl;
Vous essayez également de concaténer le numéro du joueur avec std::string::Push_back
:
Exemple avec votre code:
int i = 4;
string text = "Player ";
text.Push_back(i + '0');
cout << text;
Vous verrez dans la console:
Joueur 4
Le moyen le plus simple de comprendre cela est le suivant ..
Cela fonctionnera comme chaîne simple et tableau de chaînes. J'envisage un tableau de chaînes, car il est compliqué (un peu la même chose sera suivie avec une chaîne). Je crée un tableau de noms et append un nombre entier et un caractère avec ce caractère pour montrer comme il est facile d’ajouter des éléments int et caractères à une chaîne, J'espère que ça aide. la longueur est juste pour mesurer la taille du tableau. Si vous êtes familier avec la programmation alors size_t est un unsigned int
#include<iostream>
#include<string>
using namespace std;
int main() {
string names[] = { "amz","Waq","Mon","Sam","Has","Shak","GBy" }; //simple array
int length = sizeof(names) / sizeof(names[0]); //give you size of array
int id;
string append[7]; //as length is 7 just for sake of storing and printing output
for (size_t i = 0; i < length; i++) {
id = Rand() % 20000 + 2;
append[i] = names[i] + to_string(id);
}
for (size_t i = 0; i < length; i++) {
cout << append[i] << endl;
}
}