Hoe voeg je een int toe aan een string in C++?

Ik wil graag dat Player 4wordt afgedrukt.

Het bovenstaande is duidelijk verkeerd, maar het laat zien wat ik hier probeer te doen. Is er een gemakkelijke manier om dit te doen of moet ik beginnen met het toevoegen van nieuwe omvat?


Antwoord 1, autoriteit 100%

Met C++11 kun je schrijven:

#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);

Antwoord 2, autoriteit 74%

Nou, als je cout gebruikt, kun je het gehele getal er rechtstreeks naar schrijven, zoals in

std::cout << text << i;

De C++-manier om allerlei soorten objecten naar strings te converteren is via stringstreams. Als je er geen bij de hand hebt, maak er dan gewoon een aan.

#include <sstream>
std::ostringstream oss;
oss << text << i;
std::cout << oss.str();

U kunt ook het gehele getal converteren en aan de tekenreeks toevoegen.

oss << i;
text += oss.str();

Ten slotte bieden de Boost-bibliotheken boost::lexical_cast, die de stringstream-conversie omhult met een syntaxis zoals de ingebouwde typecasts.

#include <boost/lexical_cast.hpp>
text += boost::lexical_cast<std::string>(i);

Dit werkt ook andersom, d.w.z. om snaren te ontleden.


Antwoord 3, Autoriteit 43%

printf("Player %d", i);

(Downvote mijn antwoord Alles wat je leuk vindt; ik haat nog steeds de C++ I / O-operators.)

: – p


Antwoord 4, Autoriteit 7%

Deze werkzaamheden voor algemene snaren (voor het geval u niet wilt uitvoeren naar bestand / console, maar opslaan voor later gebruik of iets).

Boost.lexical_cast

MyStr += boost::lexical_cast<std::string>(MyInt);

String-streams

//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;

Antwoord 5, Autoriteit 3%

Voor de record kunt u ook een std::stringstreamAls u de reeks wilt maken voordat deze daadwerkelijk wordt uitgevoerd.


Antwoord 6, Autoriteit 2%

cout << text << " " << i << endl;

Antwoord 7

Uw voorbeeld lijkt aan te geven dat u de een tekenreeks wilt weergeven, gevolgd door een geheel getal, in welk geval:

string text = "Player: ";
int i = 4;
cout << text << i << endl;

zou goed werken.

Maar als u de stringplaatsen wilt opslaan of het kunt passeren, en dit vaak kunt doen, kunt u profiteren van overbelasting van de toevoegingsoperator. Ik laat dit hieronder demonstreren:

#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;
}

In feite kunt u sjablonen gebruiken om deze aanpak krachtiger te maken:

template <class T>
std::string operator+(std::string const &a, const T &b){
  std::ostringstream oss;
  oss << a << b;
  return oss.str();
}

Nu, zolang het object bheeft, heeft u een gedefinieerde stroomuitvoer, u kunt het toevoegen aan uw string (of, tenminste, een kopie daarvan).


Antwoord 8

Een andere mogelijkheid is 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;
}

Antwoord 9

Hier een klein werkende conversie / aanhangende voorbeeld, met enige code die ik nodig had.

#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;
}

de uitvoer zal zijn:

/dev/video
/dev/video456
/dev/video321
/dev/video123

Houd er rekening mee dat u in de laatste twee regels de gewijzigde tekenreeks opslaat voordat deze daadwerkelijk wordt afgedrukt, en u deze indien nodig later kunt gebruiken.


Antwoord 10

Voor de goede orde, je zou ook de klasse QStringvan Qt kunnen gebruiken:

#include <QtCore/QString>
int i = 4;
QString qs = QString("Player %1").arg(i);
std::cout << qs.toLocal8bit().constData();  // prints "Player 4"

Antwoord 11

cout << text << i;

Antwoord 12

Eén methode hier is om de uitvoer direct af te drukken als dit nodig is in uw probleem.

cout << text << i;

Anders is een van de veiligste methoden het gebruik van

sprintf(count, "%d", i);

En kopieer het dan naar je “tekst”-tekenreeks.

for(k = 0; *(count + k); k++)
{ 
  text += count[k]; 
} 

U hebt dus uw vereiste uitvoertekenreeks

Voor meer informatie over sprintf, volg:
http://www.cplusplus.com/reference/cstdio/sprintf


Antwoord 13

cout << text << i;

De operator <<voor ostream retourneert een verwijzing naar de ostream, zodat u de bewerkingen <<gewoon kunt blijven koppelen. Dat wil zeggen, het bovenstaande is in principe hetzelfde als:

cout << text;
cout << i;

Antwoord 14

cout << "Player" << i ;

Antwoord 15

cout << text << " " << i << endl;

Antwoord 16

De gemakkelijkste manier om dit te achterhalen is de volgende..
Het werkt als een enkele tekenreeksen een tekenreeksarray.
Ik overweeg een stringarray, omdat het ingewikkeld is (een klein beetje hetzelfde wordt gevolgd door een string).
Ik maak een array van namen en toevoegeneen geheel getal en char erbij om te laten zien hoe gemakkelijk het is om wat inten charstoe te voegen aan string, hoop dat het helpt.
lengte is alleen om de grootte van de array te meten. Als je bekend bent met programmeren, dan is size_teen niet-ondertekende 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;
        }
}

Antwoord 17

Er zijn een paar opties, en welke je wilt, hangt af van de context.

De eenvoudigste manier is

std::cout << text << i;

of als je dit op één regel wilt

std::cout << text << i << endl;

Als u een programma met één thread schrijft en deze code niet vaak aanroept (waarbij “veel” duizenden keren per seconde is), bent u klaar.

Als je een programma met meerdere threads schrijft en meer dan één thread schrijft naar cout, dan kan deze eenvoudige code je in de problemen brengen. Laten we aannemen dat de bibliotheek die bij uw compiler is geleverd, de thread veilig genoeg heeft gemaakt, dan dat een enkele aanroep ernaar niet zal worden onderbroken. Laten we nu zeggen dat een thread deze code gebruikt om “Player 1” te schrijven en een andere thread “Player 2”. Als je geluk hebt, krijg je het volgende:

Player 1
Player 2

Als je pech hebt, krijg je misschien zoiets als het volgende

Player Player 2
1

Het probleem is dat std::cout << tekst << ik << endl; verandert in 3 functie-aanroepen. De code komt overeen met het volgende:

std::cout << text;
std::cout << i;
std::cout << endl;

Als je in plaats daarvan de C-stijl printf hebt gebruikt en je compiler opnieuw een runtime-bibliotheek met redelijke thread-veiligheid heeft geleverd (elke functieaanroep is atomair), dan zou de volgende code beter werken:

printf("Player %d\n", i);

Als je iets kunt doen in een enkele functieaanroep, kan de io-bibliotheek zorgen voor synchronisatie onder de dekens, en nu wordt je hele tekstregel atomair geschreven.

Voor eenvoudige programma’s is std::cout geweldig. Voeg multithreading of andere complicaties toe en de minder stijlvolle printf begint er aantrekkelijker uit te zien.


Antwoord 18

Probeer ook het spelersnummer samen te voegen met std::string::push_back:

Voorbeeld met uw code:

int i = 4;
string text = "Player ";
text.push_back(i + '0');
cout << text;

Je ziet in de console:

Speler 4


Antwoord 19

U kunt het volgende gebruiken

int i = 4;
string text = "Player ";
text+=(i+'0');
cout << (text);

Antwoord 20

Als u Windows/MFC gebruikt en de tekenreeks nodig heeft voor meer dan onmiddellijke uitvoer, probeer dan:

int i = 4;
CString strOutput;
strOutput.Format("Player %d", i);

Other episodes