将由16进制数字组成的字符串转换成与之等价的整形值

     源自《The C Programming Language》P37 pr2-3:

     编写函数htoi(s),把由16进制数字组成的字符串(包含可选的前缀0X或0x)转换成与之等价的整形值,

     字符串中允许包含的数字包括:0 ~ 9, a ~ f,A ~ F。

     参考代码:

     

main.c
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;

posted on 2011-04-29 04:24  将军之盾  阅读(1171)  评论(0编辑  收藏  举报