You are on page 1of 2

C:\Keil\C51\Examples\hector\ITOA.

C /////////////////////////////////////////////////////////////////////////////////////// ///////// //Funciones para la transformacion de enteros a cadenas de caracteres //Autor: Hector Almeria Nuez //Fecha: 04/03/2011 // //version: 1.0 //Para futuras modificaciones poner nombre, explicacion de la modificacion y linea (apr oximada). /////////////////////////////////////////////////////////////////////////////////////// ///////// char cadena [7]; //cadena usada para realizar los calculos //cabeceras de las funciones contenidas unsigned int atoi (char *cadena); char * itoa(unsigned int numero); char * htoa(unsigned int numero); unsigned int exp(unsigned int base, unsigned int exponente); char * itoa(unsigned int numero) //transforma un unsigned int en una cadena de caracter es (decimal). EJ: 128 -> "128" { unsigned int aux_num=1; unsigned char i=0, numero_de_cifras=0; if(numero>65535) numero=65535; //si es mas alto no puede ser un int, ademas se sal e de la cadena reservada if(numero==0) {cadena[0]='0'; cadena[1]='\0';} //si es 0 (muy habitual) no hago ca lculos, + rapido. else { //calcular el numero de cifras while(numero >= aux_num) {aux_num=aux_num*10; numero_de_cifras++;} //vamos rellenando la cadena cadena[numero_de_cifras]='\0'; //ponemos el final de la cadena for(i=0;i<numero_de_cifras;i++) { cadena[numero_de_cifras-i-1]='0' + numero%10; //sacamos el valor de digi to de menor peso, a partir de la direccion //base del caracter 0 numero=numero/10; //"desplazamos" a la derecha el numero para continuar con el siguiente digito } } return cadena; } char * htoa(unsigned int numero) //transforma un unsigned int en una cadena de caracte res (hexadecimal). EJ: 125 0x7D -> "0x007D" { unsigned int aux_num=1; unsigned char i=0, aux=0; if(numero>65535) numero=65535; //si es mas alto no puede ser un int, ademas se sal e de la cadena reservada if(numero==0) {cadena[0]='0'; cadena[1]='x'; cadena[2]='0';cadena[3]='0';cadena[4] ='0';cadena[5]='0';cadena[6]='\0';} //si es 0 (muy habitual) no hago calculos, + rapido.(0 -> 0x0000) else { //vamos rellenando la cadena cadena[0]='0'; // "0x" cadena[1]='x'; cadena[6]='\0'; //ponemos el final de la cadena (6 es el numero de cifras -1) for(i=2;i<6;i++) //4 iteraciones, 4 digitos en hexadecimal, empieza en 2 porq Page: 1

C:\Keil\C51\Examples\hector\ITOA.C ue 0 y 1 son el '0x' { aux=numero%16; if(aux>9) { cadena[7-i]='A'+ aux-10; //'7' es el numero de cifras -1 } else cadena[7-i]='0' + aux; //sacamos el valor de digito de menor peso, a partir de la direccion //base del caracter 0 numero=numero/16; //"desplazamos" a la derecha el numero para continuar con el siguiente digito } } return cadena; } unsigned int exp(unsigned int base, unsigned int exponente) { //calcula base elevado al exponente (ej: exp(2,3) -> 2*2*2 unsigned char i=0; unsigned int resultado=base; if(exponente==0) return 1; for(i=0;i<exponente-1;i++) resultado=resultado*base; return resultado; } unsigned int atoi (char *cadena) { //transforma una cadena de caracteres en un unsigned int (Ej: "2345" -> 2345) unsigned char n_cifras, i=0, j=0; unsigned int numero=0; for(n_cifras=0;cadena[n_cifras];n_cifras++); //calculo la longitud de la cadena for(i=0;i<n_cifras;i++) { if(cadena[i] > '9' || cadena[i] < '0') return -1;//si no es un numero, error y devuelvo -1 else { numero=numero+(cadena[i]-'0')*exp(10,n_cifras-1-i); //doy el valor del nume ro en funcion de su posicion (unidades, decenas...) } } return numero; }

Page: 2

You might also like