您的位置:首页 > 其它

编写hoti(s),把由十六进制数字组成的字符串(0x或0X)转化为与之等价的整形值。字符串中允许包含的数字为:0-9,a-f或A-F。

2016-11-23 19:12 567 查看
#include <stdio.h>
#include <stdlib.h>
#include<windows.h>

/* Here's a helper function to get me around the problem of not
* having strchr
*/

//将字符c 传入函数,转化成相应的整形值,用到一个技巧。10+(i)/2,巧妙地将对应的大小写字母转换为同一个数。若为不符合条件字符返回0
int hexalpha_to_int(int c)
{
char hexalpha[] = "aAbBcCdDeEfF";
int i;
int answer = 0;

for (i = 0; answer == 0 && hexalpha[i] != '\0'; i++)
{
if (hexalpha[i] == c)
{
answer = 10 + (i / 2);
}
}

return answer;
}

//返回无符号整形
//若十六进制的字符串包含前缀0x或0X先进行++处理
//按十六进制进行计算的时候结果的整形值用answer*=16+temp,temp(为说明思路标注的临时变量)为一个16进制的数
unsigned int htoi(const char s[])
{
unsigned int answer = 0;
int i = 0;
int valid = 1;
int hexit;

if (s[i] == '0')
{
++i;
if (s[i] == 'x' || s[i] == 'X')
{
++i;
}
}

while (valid && s[i] != '\0')
{
answer = answer * 16;
if (s[i] >= '0' && s[i] <= '9')
{
answer = answer + (s[i] - '0');
}
else
{
hexit = hexalpha_to_int(s[i]);
if (hexit == 0)
{
valid = 0;
}
else
{
answer = answer + hexit;
}
}

++i;
}

if (!valid)
{
answer = 0;
}

return answer;
}

/* Solution finished. This bit's just a test driver, so
* I've relaxed the rules on what's allowed.
*/

//测试程序
//strtoul函数将字符串转化为无符号长整形数
//验证打印(*endp != '\0' && result == 0) || result == check)正确打印条件
int main(void)
{
char *endp = NULL;
char *test[] =
{
"F00",
"bar",
"0100",
"0x1",
"0XA",
"0X0C0BE",
"abcdef",
"123456",
"0x123456",
"deadbeef",
"zog_c"
};

unsigned int result;
unsigned int check;

size_t numtests = sizeof test / sizeof test[0];

size_t thistest;

for (thistest = 0; thistest < numtests; thistest++)
{
result = htoi(test[thistest]);
check = (unsigned int)strtoul(test[thistest], &endp, 16);

if ((*endp != '\0' && result == 0) || result == check)
{
printf("Testing %s. Correct. %u\n", test[thistest], result);
}
else
{
printf("Testing %s. Incorrect. %u\n", test[thistest], result);
}
}

system("pause");
return 0;
}




//全部正确
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐