标签:
最近开始自学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 }
标签:
原文地址:http://www.cnblogs.com/zhongruxin/p/4575874.html