根据书本例子,可得一种方法。十六进制。。。。。。等等,严谨写文章,不然没人看!接下来要学习计数。
算了,等我学习好再讨论计数论。华夏知识 《中算家的计数论》—— 罗见今
十六进制转换十进制,十六的零到若干次方,代表着个位、十位、百位、千位等。数的每位十六次方乘以当前位的计数符号代表值的和,即可得到对应十进制数。
当前思想就是,一个十六进制数出现多少位就乘上多是个十六,个位是零、十位是一,以此类推。
/*****************************************************************************
* 笔者:老年痴呆的梦 *
* 编码:GB 18030 *
* 语言:C语言 *
*****************************************************************************/
/* 十六机制字符串转换成十进制整型数 */
#include <stdio.h>
int htoi (char str[]);
int main (void)
{
char str[1024];
printf ("请输入十六进制字符串:\n");
scanf ("%s",&str);
if (htoi(str) != 0)
printf ("%s ->> %d\n",str,htoi(str));
else
printf ("书写格式错误!\n");
return 0;
}
/* 函数定义 */
int htoi (char s[])
{
int i , n;
int state = 0;
n = 0;
for (i = 0; s[i] != '\0'; ++i)
{
if (s[i] == '0' && s[i + 1] == 'x' || s[i +1] == 'X')
{
++i;
state = 1;
}
else if (state == 1)
if (s[i] >= '0' && s[i] <= '9')
n = 16 * n + (s[i] - '0');
else if (s[i] >= 'a' && s[i] <= 'f')
n = 16 * n + (s[i] - '0' - 39);
else if (s[i] >= 'A' && s[i] <= 'F')
n = 16 * n + (s[i] - '0' - 7);
else
state = 0;
}
return n;
}
修改完整版:
/*****************************************************************************
* 笔者:老年痴呆的梦 *
* 编码:GB 18030 *
* 语言:C语言 *
*****************************************************************************/
/* 把一个十六进制字符串转换成十进制整形数值 */
#include <stdio.h>
int htoi(char s[]);
int main ()
{
/*int 4字节 最大绝对值 1073,741,824 0x4000,0000 8个字符再加上4个字符。*/
char s[12];
printf ("请输入一个十六进制字符串--- \n");
scanf ("%s",&s);
printf ("对应的十进制数\n------0v0 %d\n",htoi (s));
return 0;
}
int htoi (char s[])
{
int i, n ;
short state = 0;
short polarity = 1;
n = 0;
for (i = 0; s[i] != '\0'; ++i)
{
if (s[i] == '-')
polarity = -1;
else if (s[i] == '0' && s[i + 1] == 'x' || s[i + 1] == 'X')
state = 1;
else if (state == 1)
if (s[i] >= '0' && s[i] <= '9')
n = 16 * n + (s[i] - '0');
else if (s[i] >= 'a' && s[i] <= 'f')
n = 16 * n + (s[i] - '0' - 39);
else if (s[i] >= 'A' && s[i] <= 'F')
n = 16 * n + (s[i] - '0' - 7);
}
return n * polarity;
}