Convertir un número completo (no un dígito) a cadena en C es un poco (sólo un poco) complicado porque no hay una función que permita hacer eso así de fácil.
Esto es distinto a cuando convertimos un simple carácter de tipo char a un entero o un dígito entero a carácter, ahora veremos cómo convertir un número de 2 o más cifras en una cadena en el lenguaje C.
Cómo funciona la conversión
Para convertir usaremos la función sprintf
que funciona como printf pero ahora no imprime nada, sino que simplemente formatea una cadena y la almacena en un búfer indicado por nosotros.
Sabiendo esto, podemos formatear un número como cadena, y ya; así de simple, la función se encarga del resto y nosotros únicamente de reservar espacio del búfer.
No todo es tan sencillo, porque como convertimos un número entero a cadena, necesitamos reservar el espacio suficiente. Si usamos un unsigned long long
, el número más grande que se puede representar es 18446744073709551615, el cual tiene 20 dígitos.
Si queremos un unsigned int
el mismo ocupa 10 dígitos, porque el mayor es 4294967295. Como sea, antes de que quieras hacer la conversión recuerda ver la longitud que tienen. Por otro lado, recuerda reservar un carácter más aparte de los dígitos que tenga.
Por ejemplo, si es de 10 dígitos entonces reserva 11 para el carácter de terminación.
En resumen…
Usa sprintf
para convertirlo. La sintaxis es:
sprintf(buferEnDondePonerLaCadenaFormateada, formato, cosaQueFormatear);
Por ejemplo:
sprintf(bufer, "%llu", numero);
Sigue leyendo para ver ejemplos.
Convertir unsigned long long en cadena usando C
Para irnos a los números más grandes, veamos cómo convertir un unsigned long long en cadena. Ya sea que este número sea un 1, 2 o hasta 18446744073709551615 la conversión será correcta.
Reservamos un búfer de 21 caracteres, 20 para los dígitos y 1 para el carácter de terminación.
/*
Convertir entero a cadena en C
@author parzibyte
*/
#include <stdio.h> // printf y sprintf
// Prototipo
void enteroACadena(unsigned long long numero, char *bufer);
int main(){
unsigned long long numero = 18446744073709551615U;
char cadena[21]; // 21, porque puede medir hasta 20 y necesitamos un adicional para le carácter de terminación
enteroACadena(numero, cadena);
printf("El entero %llu se convierte a '%s' como cadena", numero, cadena);
}
void enteroACadena(unsigned long long numero, char *bufer){
// Recuerda: llu es para un long long unsigned
sprintf(bufer, "%llu", numero);
}
La parte importante es la función enteroACadena
. Igualmente podríamos no llamar a la función y usar sprintf, pero por separar las cosas lo hacemos.
Lo que hace esto es copiar la cadena formateada al búfer. No regresa nada porque modifica directamente a la cadena, la cual es un apuntador a un arreglo de caracteres.
Convertir un simple entero sin signo
Ya convertimos un unsigned long long
, ahora vamos a convertir un unsigned int
.
/*
Convertir entero a cadena en C
@author parzibyte
*/
#include <stdio.h> // printf y sprintf
// Prototipo
void enteroACadena(unsigned int numero, char *bufer);
int main(){
unsigned int numero = 4294967295U;
char cadena[11]; // 11, porque puede medir hasta 10 y necesitamos un adicional para el carácter de terminación
enteroACadena(numero, cadena);
printf("El entero %u se convierte a '%s' como cadena", numero, cadena);
}
void enteroACadena(unsigned int numero, char *bufer){
// Recuerda: u es para un unsigned int
sprintf(bufer, "%u", numero);
}
El proceso es el mismo, sólo cambia el formato y los tipos de datos. Para formatear un entero sin signo usamos la letra u.
Sobre la seguridad
Esta función de sprintf tiene una posible vulnerabilidad de un desbordamiento de búfer si no es usada con números. Si la usas por aprender o para cosas que no necesitan seguridad, está bien.
Pero en caso de que uses otros formatos o datos que provengan del usuario, y estás haciendo algo que debe ser seguro, entonces utiliza la función snprintf cuya sintaxis es:
snprintf(bufer, caracteresQueSeCopian, formato, cosaQueFormatear);
Es muy parecida a sprintf
, pero como segundo argumento le decimos cuántos caracteres debe copiar.
Mira aquí lo que es un desbordamiento de búfer en C, o cómo puede hacerse un desbordamiento de búfer al usar scanf.
Conclusión
Así podemos convertir un número a cadena en C. Igualmente podríamos convertir cualquier tipo de dato, por ejemplo un float o double, siempre y cuando especifiquemos bien el formato.
Referencias
Únicamente la referencia a snprintf.