汇编网首页登录博客注册
assumechen的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言
好友圈
文章收藏
友情链接

[2013-05-21 17:46] 把十六进制字符串转化为数字

问题描述: 编写函数 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;
 }
评论次数(0)  |  浏览次数(538)  |  类型(The C Program Langua) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码