Ik wil graag dat Player 4
wordt 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::stringstream
Als 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 b
heeft, 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 QString
van 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);