ATOI and ITOA Custom Implementations

Discussion in 'C' started by david_BS, Feb 22, 2013.

  1. david_BS

    david_BS New Member

    Joined:
    Apr 5, 2012
    Messages:
    17
    Likes Received:
    3
    Trophy Points:
    3
    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
     

    Attached Files:

    shabbir likes this.
  2. david_BS

    david_BS New Member

    Joined:
    Apr 5, 2012
    Messages:
    17
    Likes Received:
    3
    Trophy Points:
    3
    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
     

    Attached Files:

Share This Page

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice