2011-02-03 34 views
7

tengo un código que, en su forma más completa más pequeña que presenta el problema (por ser un buen ciudadano cuando se trata de hacer preguntas), básicamente se reduce a lo siguiente:¿Por qué no se imprime mi cadena?

#include <string> 
#include <iostream> 
int main (void) { 
    int x = 11; 
    std::string s = "Value was: " + x; 
    std::cout << "[" << s << "]" << std::endl; 
    return 0; 
} 

y estoy esperando que a la salida

[Value was: 11] 

en cambio, en vez de eso, yo estoy poniendo simplemente:

[] 

¿Por qué? ¿Por qué no puedo dar salida a mi cadena? ¿Está la cadena en blanco? ¿cout está roto de alguna manera? ¿Me he ido loco?

+0

Debe incluir '' para que esto funcione correctamente, por cierto. – GManNickG

+0

Buen punto, ¿cómo es esto incluso compilando? –

+0

'gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3' lo compila sin errores, tal vez solo sea perdonador. En cualquier caso, agregar cadena no ayuda, así que lo agregaré a la pregunta para que seamos más kosher. Sin embargo, Xeo me ganó así que gracias :-) – paxdiablo

Respuesta

8

es const char[12]. Cuando agregas un entero a él, efectivamente estás haciendo referencia a un elemento de esa matriz. Para ver el efecto, cambie x a 3.

Deberá construir explícitamente std::string. Por otra parte, no puede concatenar un std::string y un número entero. Para evitar esto se puede escribir en un std::ostringstream:

#include <sstream> 

std::ostringstream oss; 
oss << "Value was: " << x; 
std::string result = oss.str(); 
+1

En este caso, dado que el número es '11' y la longitud de la cadena es 11, el puntero resultante apunta al terminador nulo. – caf

+2

Es del tipo 'const char [12]', en realidad. – GManNickG

+0

'char [11]' de hecho (creo). – paxdiablo

4

No puede agregar un puntero de caracteres y un número entero como ese (puede, pero no hará lo que espera).

Primero tendrá que convertir la x en una cadena. Usted puede hacerlo fuera de banda de la forma en C mediante el uso de la función itoa para convertir el número entero a una cadena:

char buf[5]; 
itoa(x, buf, 10); 

s += buf; 

O la forma de ETS con un sstream:

#include <sstream> 

std::ostringstream oss; 
oss << s << x; 
std::cout << oss.str(); 

O directamente en la línea cout:

std::cout << text << x; 
+0

¿No se encontraría con problemas porque x es de tipo int, no de cadena o char *? – helloworld922

+0

Eso me da '[El valor era ]' (tenía que pasar por 'od -xcb' para ver qué estaba pasando allí. – paxdiablo

+0

Cuando haces' S + = x; 'está convirtiendo el entero 11 en char 11 e intenta para obtener el carácter ASCII correspondiente. – Naveen

2

C++ no concatenan cadenas utilizando el operador +. Tampoco hay promoción automática desde los tipos de datos a la cadena.

2

En C/C++, no se puede anexar un entero a una matriz de caracteres usando el operador + debido a una matriz char decae a un puntero. Para añadir un int a un string, utilice ostringstream:

#include <iostream> 
#include <sstream> 

int main (void) { 
    int x = 11; 
    std::ostringstream out; 
    out << "Value was: " << x; 
    std::string s = out.str(); 
    std::cout << "[" << s << "]" << std::endl; 
    return 0; 
} 
+0

Una matriz no es un puntero. – GManNickG

4

Divertido :) Eso es lo que tenemos que pagar por C-compatibilidad y la falta de un sistema incorporado en string.

De todos modos, creo que la forma más legible para hacerlo sería:

std::string s = "Value was: " + boost::lexical_cast<std::string>(x); 

Debido a que el tipo de retorno es lexical_caststd::string aquí, se seleccionará la sobrecarga derecha de +.

Cuestiones relacionadas