天天看點

htoi函數

#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;
}