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