码迷,mamicode.com
首页 > 编程语言 > 详细

扩展《C程序设计语言》练习2-3程序通用性

时间:2015-06-14 23:58:03      阅读:359      评论:0      收藏:0      [点我收藏+]

标签:

  最近开始自学C语言,在看K&R的《C程序设计语言》。练习2-3要求写一个函数,将输入的十六进制数字字符串转换成与之等价的整数值,配套答案没有扩展程序的通用性,所以我就稍微改造改造。

  配套的答案是这样的(自己添加了注释):

 1 #define YES    1    
 2 #define NO     0
 3 
 4 /*    htoi:将十六进制数字字符串转换成十进制数
 5     *    如果发现‘0x‘或‘0X‘则跳过并设置十六进制数的起点
 6     *    检查后续字符是否是0-9,a-f或是A-F
 7     *    如果是则将其转换为整形
 8     *    如果不是则停止检查,数字结束
 9     *    通过公式计算相应的十进制值并返回
10 */
11 int htoi(char s[])
12 {
13     int hexdigit,i,inhex,n;
14     
15     if (s[i] == 0) {
16         ++i;
17         if (s[i] == x || s[i] == X){
18             ++i;
19         }
20     }
21     n = 0;        /*    初始化返回变量                */
22     inhex = YES;        /*    假设在合法字符中            */
23     for ( ; inhex == YES; ++i) {
24         if (s[i] >= 0 && s[i] <= 9)
25             hexdigit = s[i] - 0;
26         else if (s[i] >= a && s[i] <= f)
27             hexdigit = s[i] - a + 10;
28         else if (s[i] >= A && s[i] <= F)
29             hexdigit = s[i] - A + 10;
30         else
31             inhex = NO;
32         if (inhex == YES)
33             n = 16 * n + hexdigit;
34         }
35         return n;
36 }    

  该函数需要导入一个字符数组,我在 main() 函数中写了获取数组的代码(假设最多获取10个长度的字符数组,因为数组以 ‘\0‘ 结尾,因此总共最多获取9个有效字符):

1 int c,i;
2 char input[10];
3     
4 for ( i = 0; i < 10-1 && ((c = getchar()) != EOF); ++i)
5     input[i] = c;
6 input[i] = \0;

  将得到的字符数组传入 htoi() 函数中即可计算出转换后的值。

  但是这样有个缺陷:字符数组开头必须是 “0x” 或 “0X” 或 数字0-9 或 字母a-f 或 A-F,否则 htoi() 函数只返回 0。这样就降低了程序的通用性,那么如何才能当字符数组前头包含无用字符时,只有检测到 “0x” 或 “0X” 时才继续检测后续字符,并计算返回正确的结果?

  我的做法是在 htoi() 函数中检测是否为 “0x” 或 “0X” 的代码上添加循环:

 1 int htoi(char s[])
 2 {
 3     int hexdigit,i,inhex,n;
 4     
 5     i=0;
 6     while (s[i] != \0){
 7         if (s[i] == 0) {
 8             ++i;
 9             if (s[i] == x || s[i] == X){
10                 ++i;
11                 break;        /*    如果是“0x”或“0X”就停止循环    */
12             }
13         }
14         else
15             ++i;      /*    如果不符合则循环到底,最后s[i]=‘\0‘    */
16     }
17     n = 0;
18     inhex = YES;
19     for ( ; inhex == YES; ++i) {
20             ... ...

  运行结果如下:

技术分享

  下面把完整代码贴出来,若有幸让高手看见还请指点指点:

 1 #include <stdio.h>
 2 
 3 #define YES    1
 4 #define NO     0
 5 
 6 int htoi(char s[]);
 7 
 8 int main(void)
 9 {
10     int c,i;
11     char input[10];
12     
13     for ( i = 0; i < 10-1 && ((c = getchar()) != EOF); ++i)
14         input[i] = c;
15     input[i] = \0;
16     printf("输入的16进制数转换十进制数:%d\n",htoi(input));
17     return 0;
18 }
19 
20 int htoi(char s[])
21 {
22     int hexdigit,i,inhex,n;
23     
24     i=0;
25     while (s[i] != \0){
26         if (s[i] == 0) {
27             ++i;
28             if (s[i] == x || s[i] == X){
29                 ++i;
30                 break;
31             }
32         }
33         else
34             ++i;
35     }
36     n = 0;
37     inhex = YES;
38     for ( ; inhex == YES; ++i) {
39         if (s[i] >= 0 && s[i] <= 9)
40             hexdigit = s[i] - 0;
41         else if (s[i] >= a && s[i] <= f)
42             hexdigit = s[i] - a + 10;
43         else if (s[i] >= A && s[i] <= F)
44             hexdigit = s[i] - A + 10;
45         else
46             inhex = NO;
47         if (inhex == YES)
48             n = 16 * n + hexdigit;
49         }
50         return n;
51 }

 

扩展《C程序设计语言》练习2-3程序通用性

标签:

原文地址:http://www.cnblogs.com/zhongruxin/p/4575874.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!