Convertir número a cadena en C

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.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *