tags:

views:

7601

answers:

11

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

I'd like it to cout "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?

+2  A: 
cout << "Player" << i ;
rupello
+3  A: 
cout << text << i;
+4  A: 
cout << text << " " << i << endl;
jjnguy
+2  A: 
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;
introp
A: 
cout << text << " " << i << endl;
Geoffrey Chetwood
+2  A: 

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

Jason Baker
+7  A: 

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

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 your using a stram (eg cout), rather than std::string
someStream << MyInt;
Fire Lancer
+1  A: 
printf( "Player %d", i );

(Downvote my answer all you like, I still hate the C++ IO operators.)

:-P

Eric
+27  A: 

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 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
A: 

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.

A: 

Don't forget 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