Buenas.
Este es un pequeño problema que está resuelto hace mucho tiempo, pero a veces encuentro en algún foro respuestas de lo más complicado, así que lo voy a dejar apuntado aquí ahora que me he vuelto a acordar y que tengo algo de tiempo.
El problema aparece cuando queremos tratar un dígito numérico como carácter, o bien convertir un carácter dígito a su valor numérico, es decir, cuando queremos convertir
char c = '1' en
int n = 1 o viceversa.
La solución es acordarse de que todos los dígitos numéricos son a su vez caracteres ASCII, y que
el valor del carácter ASCII '0' (cero) es 48. Siendo n = un dígito númerico y c = un carácter numérico:
Para pasar de carácter a número:
int n = (int) (c - 48);Para pasar de número a carácter:
char c = (char) (n + 48);Incluso me voy a atrever a poner un par de ejemplos en C sin siquiera comprobar que funcionan, con que permitan comprender la idea me vale.
long
convertir_cadena_a_entero(const char *cad)
{
long num = 0;
int tam = strlen(cad); /* Longitud de la cadena recibida */
int digito;
int i;
for (i = tam ; i > 0; --i) {
digito = (int) (cad[i - 1] - 48);
num += digito * pow(10.0, tam - i);
}
return num;
}
char *
convertir_entero_a_cadena(int num)
{
#define MAX_TAM 80
char *cad;
int digito;
int i = 0;
cad = (char*) malloc(MAX_TAM * sizeof(char)); /* No olvidar liberar la memoria asignada */
memcpy(cad, "\0", MAX_TAM); /* Bruto, pero efectivo :) */
while (num >= 1) {
digito = num % 10;
if (i < MAX_TAM - 1) {
cad[i] = (char) (digito + 48);
num -= digito;
num /= 10;
}
++i;
}
/* Pero los dígitos de la cadena han quedado en orden inverso, */
/* así que los ordenamos correctamente */
int tam = strlen(cad);
char temp;
for (i = 0; i < tam / 2; ++i) {
temp = cad[i];
cad[i] = cad[tam - i - 1];
cad[tam - i - 1] = temp;
}
return cad;
}
También se puede hacer con tipos long, float, double y long double, pero hay que utilizar la función
modf,
modfl o la que proceda de su familia, para separar la parte entera de la parte decimal, y la función
fmodl o la que proceda de su familia (en lugar del operador
%), para ir obteniendo los dígitos de la parte entera (para obtener los de la parte decimal sólo hay que ir multiplicando por 10 y restando).
Pues nada más, saludos a todas y a todos.
