将由16进制数字组成的字符串转换成与之等价的整形值
源自《The C Programming Language》P37 pr2-3:
编写函数htoi(s),把由16进制数字组成的字符串(包含可选的前缀0X或0x)转换成与之等价的整形值,
字符串中允许包含的数字包括:0 ~ 9, a ~ f,A ~ F。
参考代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h>
2
3 #define YES 1
4 #define NO 0
5
6 int htoi(char s[]);
7
8 int main()
9 {
10
11 char hex_str[] = "0x*1fe*";
12
13 printf("%d\n",htoi(hex_str));
14
15 return 0;
16 }
17
18 int htoi(char s[])
19 {
20 int hexdigit, i, inhex, n;
21
22 i = 0;
23 if(s[i] == '0') //如果字符串以0x或0X开头,则跳过这两个字符
24 {
25 ++i;
26 if(s[i] == 'x' || s[i] == 'X')
27 ++i;
28 }
29 n = 0;
30 inhex = YES; //如果字符是有效16进制字符,则置index为YES
31 for(; inhex == YES; ++i)
32 {
33 if(s[i] >= '0' && s[i] <= '9')
34 hexdigit = s[i] - '0';
35 else if(s[i] >= 'a' && s[i] <= 'f')
36 hexdigit = s[i] - 'a' + 10;
37 else if(s[i] >= 'A' && s[i] <= 'F')
38 hexdigit = s[i] - 'A' + 10;
39 else
40 inhex = NO;
41 if(inhex == YES)
42 n = n * 16 + hexdigit;
43 else
44 return -1;
45 }
46
47 return n;
48 }
分析:
1, 例如字符串"0x1fe9" 对应的十进制数为:1*16^3 + 15*16^2 + 14*16^1 + 9*16^0;
2, 以int型变量inhex来标记一个待处理字符是否为有效的16进制字符,并将inhex == YES作为for循环的判断条件。
缺陷:当待处理字符串为"0x1fe*"时,结果为510,即转换了"0x1fe"而不处理最后的'*',如果是"0x*1fe",结果为0。
我认为这两种字符串都是非法的16进制字符串,应该返回-1以表示这种情况,故在for循环的最后处加上如下代码:
else
return -1;