2009-06-03 10 views

Respuesta

49

Puede usar stringstream.

#include <sstream> 

// ... 
std::string number; 
std::stringstream strstream; 
strstream << 1L; 
strstream >> number; 

Por lo general, hay algunas funciones propietarias de C en la biblioteca estándar para que su compilador también lo haga. Sin embargo, prefiero las variantes más "portátiles".

La manera C de hacerlo sería con sprintf, pero eso no es muy seguro. En algunas bibliotecas hay nuevas versiones como sprintf_s que protege contra los desbordamientos del búfer.

1

Echa un vistazo std::stringstream.

3
#include <sstream> 


    .... 

    std::stringstream ss; 
    ss << a_long_int; // or any other type 
    std::string result=ss.str(); // use .str() to get a string back 
+1

Es std :: string, not std :: String. – avakar

+0

Gracias - problema con los dedos. –

-1

La forma en que normalmente lo hago es con sprintf. Así que por mucho que podría hacer el siguiente supuesto de que usted está en una arquitectura de 32 bits:

char buf[5] = {0}; // one extra byte for null  
sprintf(buf, "%l", var_for_long); 
+1

-1. Mientras que un compilador de C++ compilará su código, ciertamente no se debe llamar C++. Además, dudo que 5 personajes sean suficientes. – avakar

+1

Por favor, no defienda sprintf en este día y edad. ¿No tenemos suficientes exploits de desbordamiento de búfer? No es que este código parezca tener ninguno escrito, pero nunca se sabe cómo cambian las cosas. – philsquared

+1

Phil, el búfer se desbordará por cualquier número por encima de 10000. – avakar

8
int main() 
{ 
    long mylong = 123456789; 
    string mystring; 
    stringstream mystream; 
    mystream << mylong; 
    mystring = mystream.str(); 
    cout << mystring << "\n"; 
    return 0; 
} 
22

Bueno, si usted es fan de copiar y pegar, aquí está:

#include <sstream> 

template <class T> 
inline std::string to_string (const T& t) 
{ 
    std::stringstream ss; 
    ss << t; 
    return ss.str(); 
} 
+0

Te perdiste la plantilla ''. – avakar

+0

Gracias, he actualizado la respuesta. –

+0

'inline' ahora es redundante. – avakar

7

No sé qué tipo de tarea que es esto, pero es más probable que el profesor no quiero una respuesta en la que simplemente llame a una función existente "mágica" (aunque esa es la forma recomendada de hacerlo), pero él quiere ver si puede implementar esto por su cuenta.

En el pasado, mi profesor solía decir algo así como: "Quiero ver si puedes programar por ti mismo, no si puedes encontrarlo en el sistema". Bueno, lo equivocado que estaba;) ..

De todos modos, si el maestro es el mismo, aquí es de la manera difícil hacerlo ..

std::string LongToString(long value) 
{ 
    std::string output; 
    std::string sign; 

    if(value < 0) 
    { 
    sign + "-"; 
    value = -value; 
    } 

    while(output.empty() || (value > 0)) 
    { 
    output.push_front(value % 10 + '0') 
    value /= 10; 
    } 

    return sign + output; 
} 

se podría argumentar que el uso no es std::string "de la manera difícil", pero supongo que lo que cuenta en el agorithm real.

+0

Esta vez está bien usar funciones listas. Pero gracias por esta buena idea. –

+0

¿De verdad? ¿Está comprobando si puedes encontrar una función en alguna parte? Sí, los tiempos han cambiado;) .. – beef2k

+0

@ beef2k Aún mejor - se da cuenta de que sé OOP, me siento impresionado y no comprueba nada más. :) –

1

Una de las cosas que no están cubiertos por nadie hasta el momento, para ayudarle a pensar sobre el problema aún más, es lo que formato debe mucho tomar cuando es arrojado a una cadena.

Solo eche un vistazo a un programa spreedsheet (como Calc/Excel). ¿Quieres que se redondee al millón más cercano, con corchetes si es negativo, siempre para mostrar el signo ... Es realmente el número una representación de otra cosa, en caso de que lo muestres en Oractal o Hex?

Las respuestas hasta ahora le han dado algunos resultados predeterminados, pero quizás no los correctos.

+0

Si lo necesitaba, podría editar mi pregunta. :) –

+0

Me encanta, le doy una respuesta considerada a la pregunta para ayudarme a pensar en la tarea en lugar de dar la respuesta que ya estaba allí y recibo un voto negativo, mientras tanto 'std :: stringstream' tiene un voto ascendente ... –

41

En C++ 11, en realidad existen funciones std :: to_string y std :: to_wstring en <string>.

string to_string(int val); 
string to_string(long val); 
string to_string(long long val); 
string to_string(unsigned val); 
string to_string(unsigned long val); 
string to_string(unsigned long long val); 
string to_string(float val); 
string to_string(double val); 
string to_string (long double val); 
1

Puede utilizar std::to_string en C++ 11

long val = 12345; 
std::string my_val = std::to_string(val); 
Cuestiones relacionadas