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

I'd like it to print Player 4.

The above is obviously wrong but it shows what I'm trying to do here. Is there an easy way to do this or do I have to start adding new includes?

LogicStuff
  • 19,397
  • 6
  • 54
  • 74
  • 5
    Also, the right word here is 'concatenate/append an integer to a string' – Gishu Sep 15 '08 at 17:26
  • you could append to string digit by digit.. – Binier Feb 04 '17 at 15:16
  • Thank you for this question! I came looking for the same answer. I believe you are a Java programmer like me, and this is how its done Java. C++ is translation for me. – Andy May 26 '23 at 11:23

20 Answers20

327

With C++11, you can write:

#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);
F14
  • 67
  • 2
  • 6
headmyshoulder
  • 6,240
  • 2
  • 20
  • 27
215

Well, if you use cout you can just write the integer directly to it, as in

std::cout << text << i;

The C++ way of converting all kinds of objects to strings is through string streams. If you don't have one handy, just create one.

#include <sstream>

std::ostringstream oss;
oss << text << i;
std::cout << oss.str();

Alternatively, you can just convert the integer and append it to the string.

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

Finally, the Boost libraries provide boost::lexical_cast, which wraps around the stringstream conversion with a syntax like the built-in type casts.

#include <boost/lexical_cast.hpp>

text += boost::lexical_cast<std::string>(i);

This also works the other way around, i.e. to parse strings.

Sebastian Redl
  • 69,373
  • 8
  • 123
  • 157
125
printf("Player %d", i);

(Downvote my answer all you like; I still hate the C++ I/O operators.)

:-P

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Eric
  • 11,392
  • 13
  • 57
  • 100
  • 28
    Problem of this answer is, that it "Prints" string and int, this does not append it and in c++ you might want to output the value into different stream than "cout", which is not possible with printf. – Kyborek Apr 19 '13 at 08:31
  • 6
    @Kyborek -- I answered the question in the same terms it was asked. If you really want to append rather than print, then there is also a set of standard library of functions to do that. See for example `sprintf` and its safe variants (http://msdn.microsoft.com/en-us/library/vstudio/ybk95axf.aspx). – Eric Apr 24 '13 at 15:29
  • 4
    Following on Eric's comment: `char cstr[10];sprintf(cstr,"Player %d",i);` or `char *cstr;asprintf(cstr,"Player %d",i);` – tomsmeding Dec 26 '13 at 17:33
18

These work for general strings (in case you do not want to output to file/console, but store for later use or something).

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;
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Fire Lancer
  • 29,364
  • 31
  • 116
  • 182
9

For the record, you can also use a std::stringstream if you want to create the string before it's actually output.

LogicStuff
  • 19,397
  • 6
  • 54
  • 74
Jason Baker
  • 192,085
  • 135
  • 376
  • 510
7
cout << text << " " << i << endl;
jjnguy
  • 136,852
  • 53
  • 295
  • 323
5

Your example seems to indicate that you would like to display the a string followed by an integer, in which case:

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

would work fine.

But, if you're going to be storing the string places or passing it around, and doing this frequently, you may benefit from overloading the addition operator. I demonstrate this below:

#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 fact, you can use templates to make this approach more powerful:

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

Now, as long as object b has a defined stream output, you can append it to your string (or, at least, a copy thereof).

LogicStuff
  • 19,397
  • 6
  • 54
  • 74
Richard
  • 56,349
  • 34
  • 180
  • 251
  • 1
    How do you this avoid the compilation error that now with the templated solution `std::string("a") + std::string("b")` is ambiguous? – Jason Harrison Nov 09 '14 at 21:55
  • How will this work? I thought you were not allowed to overload operators unless you had at-least ONE user defined class? – Jackspicer Sep 27 '18 at 22:49
  • @JaisonTitus: It compiles and runs without warnings or errors. If you can find a source for your belief, such as a standard or some other document saying that this is forbidden, I'm happy to try to address that. – Richard Sep 28 '18 at 03:28
  • Well, I was trying to do this. Basically, I wanted to overload + on a string such that I could do something like this foo("mystring"+val) where val is of type int and foo is void foo(string message); I tried using what you gave but I got a compiler error saying "adding int to the string does not append to the string". I am not sure where I read that this does not work for primitive types, but the reasoning was that if that were allowed any header could ideally override the functionality of an operator for primitive types you would not know where this was happening. Ill try finding the link. – Jackspicer Sep 28 '18 at 18:14
  • @JaisonTitus: I'm not sure that `std::string` qualifies as a primitive type, though a char array is. I can see why it could be considered a bad practice, for sure. If you're still having the problem you mention, feel free to submit it as a question and put the link here. I'm happy to take a look. – Richard Sep 28 '18 at 19:12
3

For the record, you could also use Qt's QString class:

#include <QtCore/QString>

int i = 4;
QString qs = QString("Player %1").arg(i);
std::cout << qs.toLocal8bit().constData();  // prints "Player 4"
LogicStuff
  • 19,397
  • 6
  • 54
  • 74
3

Another possibility 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;
}
Daniel James
  • 3,899
  • 22
  • 30
2

Here a small working conversion/appending example, with some code I needed before.

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

the output will be:

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

Note that in the last two lines you save the modified string before it's actually printed out, and you could use it later if needed.

Robert Parcus
  • 1,029
  • 13
  • 19
1

One method here is directly printing the output if its required in your problem.

cout << text << i;

Else, one of the safest method is to use

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

And then copy it to your "text" string .

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

Thus, you have your required output string

For more info on sprintf, follow: http://www.cplusplus.com/reference/cstdio/sprintf

LogicStuff
  • 19,397
  • 6
  • 54
  • 74
1
cout << text << i;
sth
  • 222,467
  • 53
  • 283
  • 367
0

The easiest way I could figure this out is the following..
It will work as a single string and string array. I am considering a string array, as it is complicated (little bit same will be followed with string). I create a array of names and append some integer and char with it to show how easy it is to append some int and chars to string, hope it helps. length is just to measure the size of array. If you are familiar with programming then size_t is a 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;
        }


}
Arrowkill
  • 188
  • 1
  • 3
  • 13
Code Black
  • 530
  • 5
  • 11
  • The question was answered several times and is over 7 years old and isn't concise. What is your intent with this code, which also breaks a minimal standard how to end a cpp program? `system("pause")` is on some computer systems ambiguous. Please consider. – Semo Jan 05 '16 at 22:04
0
cout << "Player" << i ;
sth
  • 222,467
  • 53
  • 283
  • 367
rupello
  • 8,361
  • 2
  • 37
  • 34
0
cout << text << i;

The << operator for ostream returns a reference to the ostream, so you can just keep chaining the << operations. That is, the above is basically the same as:

cout << text;
cout << i;
sth
  • 222,467
  • 53
  • 283
  • 367
introp
  • 263
  • 1
  • 3
0
cout << text << " " << i << endl;
sth
  • 222,467
  • 53
  • 283
  • 367
GEOCHET
  • 21,119
  • 15
  • 74
  • 98
0

There are a few options, and which one you want depends on the context.

The simplest way is

std::cout << text << i;

or if you want this on a single line

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

If you are writing a single threaded program and if you aren't calling this code a lot (where "a lot" is thousands of times per second) then you are done.

If you are writing a multi threaded program and more than one thread is writing to cout, then this simple code can get you into trouble. Let's assume that the library that came with your compiler made cout thread safe enough than any single call to it won't be interrupted. Now let's say that one thread is using this code to write "Player 1" and another is writing "Player 2". If you are lucky you will get the following:

Player 1
Player 2

If you are unlucky you might get something like the following

Player Player 2
1

The problem is that std::cout << text << i << endl; turns into 3 function calls. The code is equivalent to the following:

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

If instead you used the C-style printf, and again your compiler provided a runtime library with reasonable thread safety (each function call is atomic) then the following code would work better:

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

Being able to do something in a single function call lets the io library provide synchronization under the covers, and now your whole line of text will be atomically written.

For simple programs, std::cout is great. Throw in multithreading or other complications and the less stylish printf starts to look more attractive.

-1

You also try concatenate player's number with std::string::push_back :

Example with your code:

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

You will see in console:

Player 4

-3

You can use the following

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

If using Windows/MFC, and need the string for more than immediate output try:

int i = 4;
CString strOutput;
strOutput.Format("Player %d", i);
DarthJDG
  • 16,511
  • 11
  • 49
  • 56
Mr. Y
  • 1