Go4Expert (http://www.go4expert.com/)
-   C (http://www.go4expert.com/articles/c-tutorials/)
-   -   ATOI and ITOA Custom Implementations (http://www.go4expert.com/articles/atoi-itoa-custom-implementations-t29507/)

 david_BS 22Feb2013 08:36

ATOI and ITOA Custom Implementations

1 Attachment(s)
I wanted to make a remake of my previous BAD versions of these 2 functions.
I think they are working great now, and they're portable the same as the originals from STD library.

ATOI
Code:

```/** // By 85 // boyscout_arg@hotmail.com // etalking.com.ar // David Riedel // 2013 **/ #pragma warning (disable:4305) #pragma warning (disable:4309) #pragma warning (disable:4244) #pragma warning (disable:4018) #include <windows.h> #include <stdlib.h> #include <stdio.h> ///// int mi_atoi(const char* str)//Respetar el tipo de parámetro (Sólo cadenas) { #define LEN() for(len=0; str[len]; len++); #define POTENCIAR() for(int x=sig;x<((cifras-sig)-2);x++) m*=10; #define INDEX(i) (int)(str[i]=='0' ? 9:((int)str[i]-48)-1) #define FACTORES() for(int i=sig;i<cifras;i++){v1=tab1[INDEX(i)]; v1*=m; ac+=v1; m/=10;}         int tab1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };         int len, ocurrencias =0, sig=0;         LEN()         for(int a=0; a<len;a++) if((str[a]>=48&&str[a]<=57)) ocurrencias++;         if(ocurrencias==0) return 0;         if((sig=str[0]=='+')||(sig=str[0]=='-')) ocurrencias+=1;         if(ocurrencias<len){//Casos "11f" son 0                 return 0;         }         if(len==1) return tab1[INDEX(0)];         int ac=0, v1, cifras = len,m = 10;         POTENCIAR()         FACTORES()         if(str[0]=='-') ac*=-1;         return ac; } //////////////////// int main(){ //        char str = 'B'; //        int entero = mi_atoi(&str); //        char* str = "asdasd\0"; //        int entero = mi_atoi(str); //        char* str = "8a3\0"; //        int entero = mi_atoi(str); //        char* str = "83312321\0"; //        int entero = mi_atoi(str); //        char* str = "000000099\0"; //        int entero = mi_atoi(str); //        char* str = "9\0"; //        int entero = mi_atoi(str); //        char* str = "20\0"; //        int entero = mi_atoi(str); //        char* str = "500\0"; //        int entero = mi_atoi(str); //        char* str = "+500\0"; //        int entero = mi_atoi(str); //        char* str = "0500\0"; //        int entero = mi_atoi(str); //        char* str = "0\0"; //        int entero = mi_atoi(str); //        char* str = "10f\0"; //        int entero = mi_atoi(str); //        char* str = "01ff\0"; //        int entero = mi_atoi(str); //        char* str = "0f\0"; //        int entero = mi_atoi(str); //        char* str = "+12\0"; //        int entero = mi_atoi(str);         char* str = "-12\0";         int entero = mi_atoi(str); //        char* str = "03232\0"; //        int entero = mi_atoi(str);         printf("%d", entero);         printf("\n");         system("pause");         return 0; }```
ITOA
Code:

```/******************************************************************************************************** // By 85 // boyscout_arg@hotmail.com // etalking.com.ar // David Riedel // 2013 *********************************************************************************************************/ #pragma warning (disable:4305) #pragma warning (disable:4309) #pragma warning (disable:4244) #pragma warning (disable:4018) #include <windows.h> #include <stdlib.h> #include <stdio.h> ///// ////////////////////////////////////////////////// char* mi_itoa(int num, char* str) { #define CIFRAS() for(;copia>=10;copia/=10) cifras++; #define ADDCHAR(n) str[i+n]=(char)48+(int)v1 #define ADDZERO(n) str[i+n]=0 #define OPERATION(n) v1/=m;v2=(int)v1*m;v3-=v2;m/=10;ADDCHAR(n);v1=v3 #define FACTORES(n) {for(int i=0; i<cifras; i++){ OPERATION(n);} ADDZERO(n);} #define POTENCIAR() for(int x=0;x<(cifras-2);x++) m*=10;         char tab1[] = { '1', '2', '3', '4', '5', '6', '7', '8', '9', 0 };         if(num<0){                 num*=-1;                 if(num<10){                         str[0]='-'; str[1]=tab1[num-1]; str[2]=0; return str;                 } else {                         int copia= num, m = 10, cifras = 1;                         CIFRAS()                         str[0]='-';                         POTENCIAR()                         float v1=num; int v2=0, v3=num;                         FACTORES(1)                 }         }         else if(num==0){                 str[0]='0'; str[1]=0; return str;         } else {                 if(num<10){                         str[0]=tab1[num-1]; str[1]=0; return str;                 } else {                         int copia= num, m = 10, cifras = 1;                         CIFRAS()                         POTENCIAR()                         float v1=num;                         int v2=0, v3=num;                         FACTORES(0)                 }         }         return str; } /////////////////// int main(){         char str[256];         mi_itoa(+321312,str);         printf(str); //        itoa(02321,str,10); //        printf(str); //        mi_itoa(02321,str); //        printf(str); //        mi_itoa(-12321,str); //        printf(str); //        itoa(-012321,str,10); //        printf(str); //        mi_itoa(-012321,str,10); //        printf(str); //        mi_itoa(555,str); //        printf(str); //        mi_itoa(0,str); //        printf(str); //        mi_itoa(1,str); //        printf(str); //        mi_itoa(500,str); //        printf(str);         printf("\n");         system("pause");         return 0; } /////```
For full project in MSVCPP 6, see attachment

 david_BS 17Mar2013 11:37

ATOI and ITOA Custom Implementations

1 Attachment(s)
I wanted to improve further on the remake of my previous versions of these 2 functions.

ATOI
Code:

```/********************************************************************************************************   // By 85 // boyscout_arg@hotmail.com // etalking.com.ar // David Riedel // 2013   *********************************************************************************************************/   #pragma warning (disable:4305) #pragma warning (disable:4309) #pragma warning (disable:4244) #pragma warning (disable:4018) #include <windows.h> #include <stdlib.h> #include <stdio.h>   /////   // Sin necesidad de llamadas innecesarias a funciones de CTYPE, MATH, STRING, etc // Sin necesidad de Tablas, solo un array con los números enteros que tampoco es necesario // pero no hace la gran diferencia ;-D   //////////////////////////////////////////////////   //Se requiere pasar una cadena terminada en CERO!. //Si no se le pasa una cadena terminada en CERO, la función va a buscar el //primer 0 que encuentre y puede terminar en una sección de memoria contigua //que no pertenece a la cadena pasada como parámetro. int mi_atoi(const char* str)//Respetar el tipo de parámetro (Sólo cadenas) {         int len, ocurrencias =0, sig=0;         for(len=0; str[len]; len++);         for(int a=0; a<len;a++) if((str[a]>=48&&str[a]<=57)) ocurrencias++;         if(ocurrencias==0) return 0;         if((sig=str[0]=='+')||(sig=str[0]=='-')) ocurrencias+=1;         if(ocurrencias<len) return 0;//Casos "11f" son 0         if(len==1) return str[0]-'0';         int ac=0, v1, cifras = len,m = 1;         for(int x=0;x<((cifras-1)-sig);x++) m*=10;         for(int i=sig;i<cifras;i++){//Factoriza y acumula                 v1=str[i]-'0';                 v1*=m;                 ac+=v1;                 m/=10;         }         if(str[0]=='-') ac*=-1;         return ac; }   ////////////////////   int main(){   //        char str = 'B'; //        int entero = mi_atoi(&str);   //        char* str = "asdasd\0"; //        int entero = mi_atoi(str);   //        char* str = "8a3\0"; //        int entero = mi_atoi(str);   //        char* str = "83312321\0"; //        int entero = mi_atoi(str);   //        char* str = "000000099\0"; //        int entero = mi_atoi(str);   //        char* str = "9\0"; //        int entero = mi_atoi(str);   //        char* str = "20\0"; //        int entero = mi_atoi(str);   //        char* str = "500\0"; //        int entero = mi_atoi(str);   //        char* str = "+500\0"; //        int entero = mi_atoi(str);   //        char* str = "0500\0"; //        int entero = mi_atoi(str);   //        char* str = "0\0"; //        int entero = mi_atoi(str);   //        char* str = "10f\0"; //        int entero = mi_atoi(str);   //        char* str = "01ff\0"; //        int entero = mi_atoi(str);   //        char* str = "0f\0"; //        int entero = mi_atoi(str);   //        char* str = "+12\0"; //        int entero = mi_atoi(str);   //        char* str = "+12\0"; //        int entero = mi_atoi(str);   //        char* str = "03232\0"; //        int entero = mi_atoi(str);   //        printf("%d", entero);             printf("%d\n",mi_atoi("-110"));         printf("%d\n",mi_atoi("-10"));         printf("%d\n",mi_atoi("0"));         printf("%d\n",mi_atoi("1"));         printf("%d\n",mi_atoi("-1"));         printf("%d\n",mi_atoi("-11"));         printf("%d\n",mi_atoi("-2"));         printf("%d\n",mi_atoi("-200"));         printf("%d\n",mi_atoi("-220"));         printf("%d\n",mi_atoi("+0"));         printf("%d\n",mi_atoi("-0"));         printf("%d\n",mi_atoi("+1"));         printf("%d\n",mi_atoi("+33"));         printf("%d\n",mi_atoi("-330"));         printf("%d\n",mi_atoi("-3000")); //        printf("%d\n",mi_atoi("-1")); //        printf("%d\n",mi_atoi("-200")); //        printf("%d\n",mi_atoi("-220"));         printf("%d\n",mi_atoi("+12"));           printf("\n");         system("pause");         return 0; }```
ITOA
Code:

```/********************************************************************************************************   // By 85 // boyscout_arg@hotmail.com // etalking.com.ar // David Riedel // 2013   *********************************************************************************************************/   #pragma warning (disable:4305) #pragma warning (disable:4309) #pragma warning (disable:4244) #pragma warning (disable:4018) #include <windows.h> #include <stdlib.h> #include <stdio.h>   /////   // Sin necesidad de llamadas innecesarias a funciones de CTYPE, MATH, STRING, etc // Sin necesidad de Tablas, sólo un array con los números enteros que tampoco es necesario // pero no hace la gran diferencia ;-D   //////////////////////////////////////////////////   char* mi_itoa(int num, char* str) {         int sig = -1;         if(num<0){                 num*=-1;                 if(num<10){                         str[0]='-'; str[1]='0'+num; str[2]=0; return str;                 } else {                         sig=1;                 }         }         else if(num==0){                 str[0]='0'; str[1]=0; return str;         } else {                 if(num<10){                         str[0]='0'+num; str[1]=0; return str;                 } else {                         sig=0;                 }         }         if(sig!=-1){                 int copia= num, m = 1, cifras = 1;                 for(;copia>=10;copia/=10) cifras++;                 for(int x=0;x<(cifras-1);x++) m*=10;                 float v1=num;                 int v2=0, v3=num;                 if(sig) str[0]='-';                 for(int i=0; i<cifras; i++){//Descompone en factores                         v1/=m;                         v2=(int)v1*m;                         v3-=v2;                         m/=10;                         str[i+sig]=48+(int)v1;                         v1=v3;                 }                 str[i+sig]=0;//Si str está a 0 no es necesario..         }         return str; }   ///////////////////   int main(){             char str[256];   //        mi_itoa(321312,str); //        printf(str);   //        itoa(02321,str,10); //        printf(str);   //        mi_itoa(02321,str); //        printf(str);   //        mi_itoa(-12321,str); //        printf(str);   //        itoa(-012321,str,10); //        printf(str);   //        mi_itoa(-012321,str,10); //        printf(str);   //        mi_itoa(555,str); //        printf(str);   //        mi_itoa(0,str); //        printf(str);   //        mi_itoa(1,str); //        printf(str);   //        mi_itoa(500,str); //        printf(str);           printf(mi_itoa(+321312,str));printf("\n");         printf(mi_itoa(-321312,str));printf("\n");         printf(mi_itoa(321312,str));printf("\n");         printf(mi_itoa(+0,str));printf("\n");         printf(mi_itoa(0,str));printf("\n");         printf(mi_itoa(-0,str));printf("\n");         printf(mi_itoa(+1,str));printf("\n");         printf(mi_itoa(1,str));printf("\n");         printf(mi_itoa(-1,str));printf("\n");         printf(mi_itoa(10,str));printf("\n");         printf(mi_itoa(+10,str));printf("\n");         printf(mi_itoa(-10,str));printf("\n");         printf(mi_itoa(-110,str));printf("\n");         printf(mi_itoa(-100,str));printf("\n");           printf(mi_itoa(-5000,str));printf("\n");         printf(mi_itoa(-55555,str));printf("\n");         printf(mi_itoa(550,str));printf("\n");         printf(mi_itoa(500,str));printf("\n");         printf(mi_itoa(+330,str));printf("\n");           printf(mi_itoa(-000,str));printf("\n");         printf(mi_itoa(+000,str));printf("\n"); //        printf(mi_itoa(+00009,str));printf("\n");         printf(mi_itoa(+109,str));printf("\n");         printf(mi_itoa(-109,str));printf("\n"); //        printf(mi_itoa(-09,str));printf("\n"); //        printf(mi_itoa(+09,str));printf("\n");         printf(mi_itoa(-999,str));printf("\n"); //        printf(mi_itoa(-00000999,str));printf("\n");           printf("\n");         system("pause");         return 0; }   /////```
For full project in MSVCPP 6, see attachment

 All times are GMT +5.5. The time now is 10:36.