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
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