2012-06-01 27 views
71

La única forma que conozco es:cómo convertir de int a char *?

#include <sstream> 
#include <string.h> 
using namespace std; 

int main() { 
    int number=33; 
    stringstream strs; 
    strs << number; 
    string temp_str = strs.str(); 
    char* char_type = (char*) temp_str.c_str(); 
} 

Pero, ¿existe ningún método con menos de escribir?

+6

¿Por qué quieres un C-cadena en lugar de una cadena C++? – KillianDS

+0

use [sprintf] (http://www.cplusplus.com/reference/clibrary/cstdio/sprintf) – Kasma

Respuesta

82
  • En C++ 11, std::to_string utilizar como:

    std::string s = std::to_string(number); 
    char const *pchar = s.c_str(); //use char const* as target type 
    
  • Y en C++ 03, lo que está haciendo está bien, excepto el uso const como:

    char const* pchar = temp_str.c_str(); //dont use cast 
    
+1

La primera parte en realidad no responde la pregunta (aunque es buena información útil ya que no estaba al tanto de eso función) – jcoder

+0

@JohnB: ¿Está bien ahora? – Nawaz

+1

Mejor :) Además, es mejor que lea más sobre C++ 11 nuevamente. Conozco las grandes características, pero esto me ha hecho darme cuenta de que probablemente haya más pequeños que extrañé. – jcoder

7

Puede utilizar impulso

#include <boost/lexical_cast.hpp> 
string s = boost::lexical_cast<string>(number); 
5

solución al estilo de C podría ser el uso de itoa, pero mejor forma de hacerlo es imprimir este número en cadena utilizando sprintf/snprintf. Marque esta pregunta: How to convert an integer to a string portably?

Tenga en cuenta que la función itoano está definido en ANSI-C y no es parte de C++, pero es apoyado por algunos compiladores. Es una función no estándar, por lo tanto, debe evitar usarla. Verifique también esta pregunta: Alternative to itoa() for converting integer to string C++?

También tenga en cuenta que escribir código de estilo C durante la programación en C++ se considera una mala práctica y en ocasiones se denomina "estilo espantoso". ¿De verdad quieres convertirlo en cadena C-style char*? :)

4

no me encasillado de distancia del const en la última línea, ya que es ahí por una razón. Si no se puede vivir con un const char * a continuación, copiar mejor la matriz de caracteres como:

char* char_type = new char[temp_str.length()]; 
strcpy(char_type, temp_str.c_str()); 
+0

quieres decir 'const char * char_type = temp_str.c_str();' ¿es mejor? – rsk82

+1

Sí. c_str le da un puntero al búfer interno del objeto de cadena. Si rechaza la construcción, usted u otro programador podría pensar que está bien cambiar el buffer a través de la variable non-const. Pero no lo es. El objeto de cadena original no sabe nada acerca de estos cambios. Por otro lado, la cadena todavía posee el búfer. Si el objeto de cadena sale del alcance, la memoria que está detrás del puntero es eliminada por el destructor de objetos de cadena, dejándolo con un puntero colgante. La operación de copia elimina ambos problemas. – user331471

+1

Alternativamente, 'std :: vector temp_vec (temp_str.begin(), temp_str.end()); temp_vec.push_back (0); char * char_type = & vec [0]; '. Esto le da memoria mutable, aunque, por supuesto, todavía necesita mantener el vector activo durante el tiempo que desee utilizar el puntero. –

6

Creo que se puede utilizar un sprintf:

int number = 33; 
char* numberstring[(((sizeof number) * CHAR_BIT) + 2)/3 + 2]; 
sprintf(numberstring, "%d", number); 
+0

debe cambiar char * a char, ahora numbertring es una matriz de punteros – josefx

+1

Además, necesita 12 caracteres para convertir un entero de 32 bits en una representación de base-10 terminada en nulo. 10 no es suficiente para '-2147483647'. –

+2

¿Qué tal una explicación? '(((sizeof number) * CHAR_BIT) + 2)/3 + 2' se parece a la magia ... –

1

También puede utilizar la fundición.

ejemplo:

string s; 
int value = 3; 
s.push_back((char)('0' + value));