2008-09-15 23 views
123
int i = 4; 
string text = "Player "; 
cout << (text + i); 

Me gustaría imprimir Player 4.¿Cómo añades un int a una cadena en C++?

Lo anterior es obviamente incorrecto, pero muestra lo que estoy tratando de hacer aquí. ¿Hay una manera fácil de hacer esto o tengo que comenzar a agregar nuevas inclusiones?

+0

¡Ha, es mejor que pueda usar uno de esos! – jjnguy

+5

Además, la palabra adecuada aquí es 'concatenar/agregar un entero a una cadena' – Gishu

+0

que podría agregar a la cadena dígito por dígito ... – user2971569

Respuesta

1
cout << text << i; 
6
cout << text << " " << i << endl; 
0
cout << text << i; 

El operador << para ostream devuelve una referencia a la ostream, por lo que sólo puede mantener el encadenamiento de las operaciones <<. Es decir, lo anterior es básicamente el mismo que:

cout << text; 
cout << i; 
0
cout << text << " " << i << endl; 
9

Para el registro, también se puede utilizar un std::stringstream si desea crear la cadena antes de que sea realmente de salida.

18

estos trabajos para cadenas generales (en caso de que no desee dar salida a archivo/consola, pero almacenar para su uso posterior o algo así).

boost.lexical_cast

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

cadena arroyos

//sstream.h 
std::stringstream Stream; 
Stream.str(MyStr); 
Stream << MyInt; 
MyStr = Stream.str(); 

//if you're using a stream (eg cout), rather than std::string 
someStream << MyInt; 
+0

Muchas gracias, estoy trabajando con Edit Fields en Win32 y necesitaba saber cómo agregar una int a sus títulos, esto fue de gran ayuda. – moonbeamer2234

109
printf("Player %d", i); 

(Downvote mi respuesta todo lo que quiera, todavía odio los operadores de C++ IO.)

:-P

+27

-1 por no ser útil en absoluto ... –

+14

El problema de esta respuesta es que "Imprime" cadena e int, esto no lo agrega y en C++ es posible que desee generar el valor en una secuencia diferente de "cout" , que no es posible con printf. – Kyborek

+4

@Kyborek - Respondí la pregunta en los mismos términos en que se me preguntó. Si realmente desea agregar en lugar de imprimir, también hay un conjunto de biblioteca estándar de funciones para hacer eso. Ver por ejemplo 'sprintf' y sus variantes seguras (http://msdn.microsoft.com/en-us/library/vstudio/ybk95axf.aspx). – Eric

182

Bueno, si utiliza cout simplemente puede escribir el número entero directamente a ella, como en

std::cout << text << i; 

El C++ manera de convertir todo tipo de objetos a través de las cadenas es string streams. Si no tiene uno a mano, solo cree uno.

#include <sstream> 

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

O bien, puede convertir el número entero y anexarlo a la cadena.

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

Por último, las bibliotecas Boost proporcionan boost::lexical_cast, que se envuelve alrededor de la conversión stringstream con una sintaxis como la incorporada en el tipo de yesos.

#include <boost/lexical_cast.hpp> 

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

Esto también funciona a la inversa, es decir, para analizar cadenas.

-1

Hay algunas opciones, y la que desee depende del contexto.

La forma más sencilla es

std::cout << text << i; 

o si usted quiere esto en una sola línea

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

Si está escribiendo un programa único de roscado y si no lo está llamando el código mucho (donde "mucho" es miles de veces por segundo), entonces has terminado.

Si está escribiendo un programa de subprocesos múltiples y más de un hilo está escribiendo para cout, este simple código puede ocasionarle problemas. Supongamos que la biblioteca que viene con el compilador hizo que el hilo de cout sea lo suficientemente seguro como para que no se interrumpa ninguna llamada individual. Ahora digamos que un hilo está usando este código para escribir "Jugador 1" y otro está escribiendo "Jugador 2". Si tienes suerte, se obtiene lo siguiente:

Player 1 
Player 2 

Si tienes la mala suerte que podría obtener algo como lo siguiente

Player Player 2 
1 

El problema es que std :: cout < < texto < < i < < endl; se convierte en 3 llamadas de función. El código es equivalente a la siguiente:

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

Si en cambio utilizó el printf al estilo de C, y de nuevo su compilador proporciona una biblioteca de tiempo de ejecución con hilo de seguridad razonable (cada llamada a la función es atómica), entonces el siguiente código funciona mejor:

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

ser capaz de hacer algo de una sola llamada de función permite la biblioteca io proporcionar sincronización debajo de las sábanas, y ahora toda su línea de texto se escribirá atómicamente.

Para programas simples, std :: cout es genial. Agregue el subprocesamiento múltiple u otras complicaciones y el printf con menos estilo comienza a verse más atractivo.

3

Otra posibilidad es 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; 
} 
2

Para el registro, también se puede utilizar la clase de Qt QString:

#include <QtCore/QString> 

int i = 4; 
QString qs = QString("Player %1").arg(i); 
std::cout << qs.toLocal8bit().constData(); // prints "Player 4" 
+2

Solo para Completitud, un equivalente es: std :: cout << qPrintable (qs); – cmannett85

-5

Si utiliza Windows/MFC, y la necesidad de la cadena durante más de salida inmediata Prueba:

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

Aquí una pequeña conversión de trabajo/appen ejemplo ding, con algún código que necesitaba antes.

#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 salida será:

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

Tenga en cuenta que en las dos últimas líneas de guardar la cadena modificada antes de que sea realmente imprime, y se podía utilizar más adelante si es necesario.

-3

Usted puede usar la siguiente

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

Su ejemplo parece indicar que le gustaría mostrar la una cadena seguida de un número entero, en cuyo caso:

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

funcionaría bien.

Pero, si va a almacenar los lugares de la cuerda o pasándolos, y hacerlo con frecuencia, puede beneficiarse de la sobrecarga del operador de adición. Demuestro esto a continuación:

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

De hecho, puede utilizar las plantillas para que este enfoque sea más potente:

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

Ahora, siempre y cuando objeto b tiene una salida de corriente definida, puede agregarlo a su cadena (o, al menos, una copia de la misma).

+1

¿Cómo se evita esto el error de compilación que ahora con la solución con plantilla 'std :: string (" a ") + std :: string (" b ")' es ambiguo? –

179

con C++ 11, se puede escribir:

int i = 4; 
std::string text = "Player "; 
text += std::to_string(i); 
+16

C++ 11 hace tantas muchas gracias más. Gracias por su respuesta, esta es la respuesta correcta para todos los que pueden usar C++ 11. – usr1234567

1

Uno de los métodos que aquí se está imprimiendo directamente la salida si es necesario en su problema.

cout << text << i; 

lo demás, uno de los métodos más segura es utilizar

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

Y luego copiarlo en su cadena "texto".

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

Por lo tanto, usted tiene su cadena de salida requerida

Para obtener más información sobre sprintf, sigue: http://www.cplusplus.com/reference/cstdio/sprintf

1

La forma más sencilla que podría resolver esto es la siguiente ..
Funcionará como cadena única y cadena matriz. Estoy considerando una matriz de cadenas, ya que es complicada (un poco se seguirá con la cadena). puedo crear una matriz de nombres y anexar algún entero y la carbonilla con él para mostrar lo fácil que es añadir un poco de int y caracteres a cuerda, espero que ayude. longitud es solo para medir el tamaño de la matriz.Si está familiarizado con la programación a continuación size_t es el número de un sin firmar 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; 
     } 


} 
+0

¡Bienvenido a StackOverflow! Considere agregar un poco de descripción a su código, como, por ejemplo, por qué y cómo funciona. – Aurasphere

+1

Lo haré aurasphere Gracias por su amable consejo –

+0

La pregunta fue respondida varias veces y tiene más de 7 años de antigüedad y no es conciso. ¿Cuál es su intención con este código, que también rompe un estándar mínimo de cómo finalizar un programa de cpp? 'system (" pause ")' es ambiguo en algunos sistemas informáticos. Por favor considera. – Semo

-1

También intenta jugador concatenar con std::string::push_back:

Ejemplo con su código:

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

Se hará ver en consola:

Player 4