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
ITOA
For full project in MSVCPP 6, see attachment
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;
}
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;
}
/////
shabbir
likes this
