2011-11-28 23 views
6

Por ejemplo, si tengo esta pequeña función:Cómo devolver cadena que contiene cadena/variables int

string lw(int a, int b) {  
    return "lw $" + a + "0($" + b + ")\n"; 
} 

.... y hacer la llamada lw(1,2) en mi función principal que quiero que vuelva "lw $1, 0($2)".

Pero Me aparece un error: invalid operands of types ‘const char*’ and ‘const char [11]’ to binary ‘operator+’

¿Qué estoy haciendo mal? Casi copié un ejemplo de la clase, y lo cambié para adaptarme a mi función.

Respuesta

10

Está intentando concatenar enteros a cadenas, y C++ no puede convertir valores de tales tipos diferentes. Su mejor opción es utilizar std::ostringstream para construir la cadena de resultado:

#include <sstream> 

// ... 

string lw(int a, int b) 
{ 
    ostringstream os; 
    os << "lw $" << a << "0($" << b << ")\n"; 
    return os.str(); 
} 

Si tiene Boost, puede utilizar Boost.Lexical_cast:

#include <boost/lexical_cast.hpp> 

// ... 

string lw(int a, int b) 
{ 
    return 
     string("lw $") + 
     boost::lexical_cast<std::string>(a) + 
     string("0($") + 
     boost::lexical_cast<std::string>(b) + 
     string(")\n"); 
} 

Y ahora con C++ 11 y más tarde es std::to_string:

string lw(int a, int b) 
{ 
    return 
     string("lw $") + 
     std::to_string(a) + 
     string("0($") + 
     std::to_string(b) + 
     string(")\n"); 
} 
+0

funcionó muy bien, gracias. – Rima

+0

Si bien su primera oración es correcta, también es completamente irrelevante para la pregunta ya que el OP no concatena 'std :: string's. –

+0

@MarkB Tienes razón. Respuesta actualizada para que sea más clara. –

1

No se pueden agregar literales de cadena (como "hola") a enteros. Eso es lo que el compilador te dice. Esta es una respuesta parcial a tu pregunta. Consulte cómo para lograr lo que desea en otras publicaciones.

+0

De hecho, * puede * agregar tanto 'char' como' char * 'a enteros. Es solo que la mayoría de las veces eso no hace lo que quieres. –

+0

@MarkB Mejoraré mi respuesta. – Beginner

2
#include <sstream> 

string lw(int a, int b) {  
    std::string s; 
    std::stringstream out; 
    out << "lw $" << a << "0($" << b << ")" << endl; 
    s = out.str(); 
    return s; 
} 
+0

Funciona, pero está pagando una copia local superflua de 'out.str()' ... ¿por qué hacer esa copia? (También señalaré algo que no aprendí hasta hace poco, que es que en el caso general 'endl' no es un sinónimo de' "\ n" '- vacía la transmisión. Así que he dejado de "poner en orden" los usos de '" \ n "' para usar 'endl' ...) – HostileFork

2

utilizar un ostringstream:

#include <sstream> 
... 
string lw(int a, int b) { 
    std::ostringstream o; 
    o << "lw $" << a << "0($" << b << ")\n"; 
    return o.str(); 
} 
0

Para comprender esta cuestión, hay que saber que en C++, literales de cadena como "lw $" son tratados como const char[] como heredado del lenguaje C. Sin embargo, esto significa que solo obtendrá operadores definidos para matrices o, en este caso, el caso de matriz degrada a puntero.

Entonces, ¿qué sucede si tiene un literal de cadena y luego agrega un entero, creando un nuevo puntero. A continuación, intenta agregar otro literal de cadena que de nuevo se degrada a char*. No puede agregar dos punteros juntos, lo que genera el error que está viendo.

Está intentando formatear enteros en un formato de cadena con texto de delimitación. En C++, la forma canónica de hacerlo es con cadenas de caracteres:

#include <sstream> 

string lw(int a, int b) 
{ 
    std::ostringstream os; 
    os << "lw $" << a << "0($" << b << ")\n"; 
    return os.str(); 
} 
Cuestiones relacionadas