2012-04-18 10 views
28

Estoy tratando de hacer algo muy simple y, sin embargo, después de una hora de búsqueda no puedo encontrar una respuesta adecuada, así que me falta algo bastante obvio.C++ crear una cadena de texto y variables

Estoy tratando de crear dinámicamente nombres de archivo para su uso con ifstream. Aunque entiendo que hay varios métodos disponibles para hacer esto, me he decidido a crear una std :: string, y el uso de stringname.c_str para convertir a const.

El problema es, sin embargo, que necesito crear la cadena con una combinación de variables y valores de texto predefinidos. Recibo errores de compilación, por lo que debe tratarse de un problema de sintaxis.

Pseudo

std::string var = "sometext" + somevar + "sometext" + somevar; 

Gracias!

+4

si es una sintaxis incorrecta o debe publicar el código real, entonces podemos decirle que quiere que el error de sintaxis sea (y por qué es incorrecto) y obtendrá más información que si le proporcionamos la sintaxis correcta. – twain249

+0

'std :: string var = std :: string (" sometext ") + somevar +" sometext "+ somevar;' –

Respuesta

44

¿Ha considerado usar cadenas de caracteres?

#include <string> 
#include <sstream> 

std::ostringstream oss; 
oss << "sometext" << somevar << "sometext" << somevar; 
std::string var = oss.str(); 
+0

Exactly + std :: ostringstream sería suficiente. – doc

+0

Gracias @eli: este fue el método que había intentado inicialmente sin suerte, ¡pero que ahora está funcionando! ¿Puede explicar lo que ss.str() está haciendo en absoluto? –

+0

'ss.str()' está extrayendo el contenido de 'stringstream'. –

2

También puede utilizar sprintf:

char str[1024]; 
sprintf(str, "somtext %s sometext %s", somevar, somevar); 
+2

Esto no es muy seguro sin embargo. La complejidad adicional de hacer que sea seguro probablemente hace que no sea una muy buena opción. –

+0

'snprintf()' sería una mejor opción. 'snprintf (str, 1024," somtext% s algún texto% s ", somevar, somevar);' – doc

+2

Esto no es seguro, pero * también * es útil en comparación con bulky std :: string & ostringstream. – Yury

16
std::string var = "sometext" + somevar + "sometext" + somevar; 

Esto no funciona debido a que las adiciones se realizan de izquierda a derecha y "sometext" (la primera) es sólo un const char *. No tiene operator+ para llamar. La solución más sencilla es la siguiente:

std::string var = std::string("sometext") + somevar + "sometext" + somevar; 

Ahora, el primer parámetro de la lista de izquierda a derecha de + operaciones es una std::string, que tiene una operator+(const char *). Ese operador produce una cuerda, que hace que el resto de la cadena funcione.

También puede realizar todas las operaciones estén en var, que es un std::string y por lo tanto tiene todos los operadores necesarios:

var = "sometext"; 
var += somevar; 
var += "sometext"; 
var += somevar; 
+1

... suponiendo que * tipo * de 'somevar' está en la lista' operador + (* tipo *) '. – doc

+0

@doc Sí. De lo contrario, tendrás que agregar un código alrededor de 'somevar' para que funcione.Por ejemplo, si se trata de un 'int', puede usar Boost :: lexical_cast para convertirlo en una cadena. (O, en ese caso, la solución 'stringstream' podría ser mejor). –

2

Ver también boost::format:

#include <boost/format.hpp> 

std::string var = (boost::format("somtext %s sometext %s") % somevar % somevar).str(); 
10

En C++ 11 puede usar std::to_string:

std::string var = "sometext" + std::to_string(somevar) + "sometext" + std::to_string(somevar); 
Cuestiones relacionadas