#include<stdio.h>
#include<stdlib.h>
/* 方案一,模拟KR書本的atoi
int hexalpha_to_int(int c)
{
char hexalpha[] = "aAbBcCdDeEfF";
int i;
int answer=0;
for(i=0;answer==0&&hexalpha[i]!='/0';i++)
if(hexalpha[i]==c)
answer=10+(i/2);
return answer;
}
unsigned int my_htoi(const char s[])
{
unsigned int answer=0;
int i=0;
int valid=1;
int hexint;
if(s[i]=='0')
{
i++;
if(s[i]=='x'||s[i]=='X')
i++;
}
while(valid&&s[i]!=0)
{
answer = answer*16;
if(s[i]>='0'&&s[i]<='9')
answer+=s[i]-'0';
else
{
hexint=hexalpha_to_int(s[i]);
if(hexint==0)
valid=0;
else
answer+=hexint;
}
i++;
}
if(!valid)
answer=0;
return answer;
}
*/
//方案2,數學計算方法
long hchartoi(char hexdig,int pos)
{
char hexdigits[]="0123456789ABCDEF";
char *p=hexdigits;
long deci=0;
int i;
while(*p != toupper(hexdig)&&deci<16){
++p;
++deci;
}
if(*p==toupper(hexdig)){
for(i=0;i<pos;i++)
deci*=16;
return deci;
}
return -1;
}
int my_htoi(char s[])
{
char *p=&s[strlen(s)-1];
long deci=0,dig=0;
int pos=0;
while(p>=s){
if((dig=hchartoi(*p,pos)<0))
{
printf("Error/n");
return -1;
}
deci+=dig;
p--;
++p;
}
return deci;
}
int main(void)
{
char *endp=NULL;
char *test[]={"F00","bar","0XBE","0X234"};
unsigned int result;
unsigned int check;
size_t numtests= sizeof test / sizeof test[0];
size_t thistest;
for(thistest=0;thistest<numtests;thistest++)
{
result=my_htoi(test[thistest]);
check=(unsigned int)strtoul(test[thistest],&endp,16);
if((*endp!='/0'&&result==0)||result==check)
{
printf("Test %s. Correct. %u/n",test[thistest],result);
}
else
{
printf("Testing %s . Incorrect. %u/n",test[thistest],result);
}
}
return 0;
}