编写函数 htoi(s),把由十六进制数字组成的字符串(包含可选的前缀0x或0X)转换为与之等价的整型值。字符串中允许包含的数字包括:0~9、a~f以及A~F。
#include <stdio.h>
unsigned int htoi(char s[], int *valid);
int main()
{
char *test[] =
{
"F00",
"bar",
"0100",
"0x1",
"0XA",
"0X0C0BE",
"abcdef",
"123456",
"0x123456",
"deadbeef",
"zog_c"};
unsigned int result;
int valid;
size_t n, i;
n = sizeof test / sizeof test[0];
for (i = 0; i < n; i++)
{
result = htoi(test[i], &valid);
if (valid > 0)
printf("%s: %u\n", test[i], result);
else
printf("%s: error\n", test[i]);
}
}
unsigned int htoi(char s[], int *valid)
{
int i, n, l;
unsigned int hex, digit;
i = l = 0;
hex = digit = 0;
if (s[0] == '0' && (s[1] == 'X' || s[1] == 'x'))
i = 2;
while (s[l] != '\0')
l++;
l -= i;
*valid = 1;
for (n = 0; n < l; n++, i++)
{
hex = hex * 16;
if (s[i] >= 'a' && s[i] <= 'f')
{
digit = 10 + s[i] - 'a';
}
else if (s[i] >= 'A' && s[i] <= 'F')
{
digit = 10 + s[i] - 'A';
}
else if (s[i] >= '0' && s[i] <= '9')
{
digit = s[i] - '0';
}
else
{
*valid = -1;
return 1;
}
hex = hex + digit;
}
return hex;
}