Go4Expert

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 09:59.