问题描述: 编写函数 htoi(s),把由十六进制数字组成的字符串(包含可选的前缀0x或0X)转换为与之等价的整型值。字符串中允许包含的数字包括:0~9、a~f 以及 A~F。
步骤:
1. 先判断字符串的长度是否大于2, 因为十六进制数字字符串以0x或0X开始, 长度肯定大于2
2. 先判断十六进制的字符串是否为 0x或0x开始, 非法格式则返回-1
3. 把字符串编码范围在'A'到'F'范围内的转成小写字符
4. 按公式 n = base^power * bit来计算数值. n:就是十六进制表示的十进制值, base就是基数16, power就是对应的位权, bit就是位的数字
^表示求幂
程序代码:
#include<stdio.h>
/* lower: convert c to lower case, only ascii */
int lower(int c);
/* power: calculate the base to n power*/
int power(int base, int n);
/* htoi: convert s of hex string to integer */
int htoi(char s[]);
int main(void)
{
printf("%d\r\n", htoi("0XAE"));
printf("%d\r\n", htoi("0x11"));
return 0;
}
/* lower: convert c to lower case, only ascii */
int lower(int c)
{
if (c>='A' && c<='Z')
return c + 'a' - 'A';
else
return c;
}
/* power: calculate the base to n power*/
int power(int base, int n)
{
if (n == 0)
return 1;
int i, ret = base;
for (i=1; i<n; i++){
ret = ret * base;
}
return ret;
}
/*
exercise2-3
编写函数 htoi(s),把由十六进制数字组成的字符串(包含可选的前缀0x或0X)转换为与之等价的整型值。
字符串中允许包含的数字包括:0~9、a~f 以及 A~F。
*/
int htoi(char s[])
{
int i;
int n = 0;
int len = strlen(s);
if (len < 3)
return -1;
if (s[0] == '0' && lower(s[1]) == 'x'){
for(i=2; i<len; i++){
int c = s[i];
int k = 0;
if (c>='A' && c<='F')
c = lower(c);
if (c>='0' && c<='9'){
k = c - '0';
// 因为高位在左边,所以计算位权时要"字符串长度-第几位-1"
n = n + power(16, len - i - 1) * k;
}
else if ((c>='a' && c<='f'))
{
k = (c - 'a' + 10);
n = n + power(16, len - i - 1) * k;
}
else{
return -1;
}
}
}
return n;
}
- [assumechen] 呵呵,我把程序搞复杂了。谢谢! 07/12 23:58
- [fpamc] MOV BX,AX MOV AX,DX MOV DX,0 07/11 23:26
- [assumechen] 这个公式原来一直想不明白,总是觉得会溢出,直到看到这个贴子才转过来。 http://www.asm 07/11 21:19
- [assumechen] 谢谢! 07/11 21:16
- [fpamc] 对的。 07/09 23:04
- [assumechen] 谢谢 06/30 22:34
- [assumechen] 谢谢 06/30 22:33
- [fpamc] 对的。 06/30 10:26
- [fpamc] 恩对的, 06/30 10:24
- [assumechen] 是程序错了,把这一句: mov word ptr es:[0dH],ax ; 雇员的平 06/29 14:45