La única forma que conozco es:
#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 hay algún método con menos escritura?
c++
integer
const-char
rsk82
fuente
fuente
Respuestas:
En C ++ 17, utilícelo
std::to_chars
como:En C ++ 11, utilícelo
std::to_string
como:Y en C ++ 03, lo que está haciendo está bien, excepto que se usa
const
como:fuente
std::string
por defecto, en lugar dechar*
.std::string
está disponible de forma predeterminada, a menos que se especifique explícitamente en la pregunta. ¿Tiene sentido? Además, dado que la pregunta en sí usastd::string
(ystd::stringstream
), no tiene muchas razones para no estar de acuerdo con ella.Creo que puedes usar un sprintf:
fuente
-2147483647
.(((sizeof number) * CHAR_BIT) + 2)/3 + 2
parece hechicería ...Puedes usar boost
fuente
La solución de estilo C podría ser usar
itoa
, pero la mejor manera es imprimir este número en una cadena usandosprintf
/snprintf
. Compruebe esta pregunta: ¿Cómo convertir un número entero en una cadena de forma portátil?Tenga en cuenta que la
itoa
función no está definida en ANSI-C y no es parte de C ++, pero es compatible con algunos compiladores. Es una función no estándar, por lo que debe evitar su uso. Compruebe también esta pregunta: ¿ alternativa a itoa () para convertir un entero en una cadena C ++?También tenga en cuenta que escribir código de estilo C mientras se programa en C ++ se considera una mala práctica y, a veces, se lo denomina "estilo espantoso". ¿Realmente quieres convertirlo en una
char*
cadena de estilo C ? :)fuente
No encasillaría la const en la última línea ya que está ahí por una razón. Si no puede vivir con un char * const, entonces es mejor que copie la matriz char como:
fuente
const char* char_type = temp_str.c_str();
es mejor?std::vector<char> temp_vec(temp_str.begin(), temp_str.end()); temp_vec.push_back(0); char *char_type = &vec[0];
. Esto le brinda memoria mutable, aunque, por supuesto, aún necesita mantener vivo el vector durante el tiempo que desee usar el puntero.string
y no se moleste con la vieja, simple, estúpidachar *
de la vieja, simple C. <se pretenden trozos de llama>char*
, no "¿tiene algún sentido llamar desde C ++ a bibliotecas existentes escritas en C, o debería volver a implementarlas en C ++?" ;-pMuy bien ... en primer lugar, necesitaba algo que hiciera lo que esta pregunta es, ¡pero lo necesitaba RÁPIDO! Desafortunadamente, la forma "mejor" es de casi 600 líneas de código. Perdone el nombre que no tiene nada que ver con lo que está haciendo. El nombre correcto era Integer64ToCharArray (valor int64_t);
https://github.com/JeremyDX/All-Language-Testing-Code/blob/master/C%2B%2B%20Examples/IntegerToCharArrayTesting.cpp
Siéntase libre de intentar limpiar ese código sin afectar el rendimiento.
Entrada: cualquier valor de 64 bits con signo desde el rango mínimo al máximo.
Ejemplo:
Salida:
Pruebas de velocidad originales: ( Integer64ToCharArray (); )
En el mejor de los casos, valor de 1 dígito.
En el peor de los casos, valor de 20 dígitos.
Nuevas pruebas de velocidad de diseño: ( AddDynamicallyToBuffer (); )
En el mejor de los casos, valor de 1 dígito.
Peor caso de 32 bits: valor de 11 dígitos.
1 billón negativo en el peor de los casos: valor de 14 dígitos.
64 bits en el peor de los casos: valor de 20 dígitos.
¡Cómo funciona!
Realizamos una técnica de Divide and Conquer y una vez que tenemos la longitud máxima de la cadena, simplemente establecemos el valor de cada carácter individualmente. Como se muestra en las pruebas de velocidad anteriores, las longitudes más grandes tienen grandes penalizaciones de rendimiento, pero aún es mucho más rápido que el método de bucle original y ningún código ha cambiado entre los dos métodos, además de que el bucle ya no está en uso.
En mi uso, de ahí el nombre, devuelvo el desplazamiento en su lugar y no edito un búfer de matrices de caracteres, sino que comienzo a actualizar los datos de vértice y la función tiene un parámetro adicional para el desplazamiento, por lo que no se inicializa en -1.
fuente
Vea esta respuesta https://stackoverflow.com/a/23010605/2760919
Para su caso, simplemente cambie el tipo en snprintf de long ("% ld") a int ("% n").
fuente
Esto puede ser un poco tarde, pero también tuve el mismo problema. La conversión a char se abordó en C ++ 17 con la biblioteca "charconv".
https://en.cppreference.com/w/cpp/utility/to_chars
fuente
También puedes usar el casting.
ejemplo:
fuente