问题:写一函数,输入一个十六进制数,输出相应的十进制数。
程序的运行示例如下:
输入十六进制数:
3a
十进制数58
继续吗?
y
输入十六进制数:
2f
十进制数47
继续吗?
N
#include <stdio.h>
#define MAX 1000
int main()
{
int c, i, flag, flag1;
char t[MAX];
i = 0;
flag = 0;
flag1 = 1;
printf("\n输入十六进制数:");
while ((c = getchar()) != '\0' && i < MAX && flag1)
//int c不是int吗为什么能直接用getchar,getchar不是只能输入字符码?以及16进制中也包含字母,用int c不会出错吗?
{
if (c >= '0' && c <= '9' || c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F')
{
flag = 1;
t[i++] = c; //这里的int为什么直接转化为char了?
}
else if (flag)
{
t[i] = '\0';
printf("\n十进制数%d\n", htoi(t));
printf("继续吗?");
c = getchar();
if (c == 'N' || c == 'n')
{
flag1 = 0;
}
else
{
flag = 0;
i = 0;
printf("\n输入十六进制数:");
}
}
}
return 0;
}
htoi(char s[])
{
int i, n;
n = 0;
for (i = 0; s[i] != '\0'; i++)
{
if (s[i] >= '0' && s[i] <= '9')
{
n = n * 16 + s[i] - '0';
}
if (s[i] >= 'a' && s[i] <= 'f')
{
n = n * 16 + s[i] - 'a' + 10;
}
if (s[i] >= 'A' && s[i] <= 'F')
{
n = n * 16 + s[i] - 'A' + 10;
}
}
return n;
}
我把疑惑写在相应代码行了,以及我不太能理清这个代码里面十六进制的输入和int char之间的关系,求解答,谢谢。
你可以看到,a是97 b是98 c是99... A是65,B是66,C是67... 0是48 1是49 2是50 ...
因此有
n = '3' - '0' 就是 n = 51 - 48 = 3 就把字符'3'转换成数字3了。
类似的
n = 'B' - 'A' + 10可以把十六进制的B转换为11。
if (s[i] >= '0' && s[i] <= '9')
{
n = n * 16 + s[i] - '0';
}
if (s[i] >= 'a' && s[i] <= 'f')
{
n = n * 16 + s[i] - 'a' + 10;
}
if (s[i] >= 'A' && s[i] <= 'F')
{
n = n * 16 + s[i] - 'A' + 10;
}
所以这些代码可以从字符串转换为对应的数字
1、char的范围是0-255, 使用一个int来存储是没有问题的;
2、16进制数的范围是0-15(0-f); 对应字符为'0'-'9', 'a'-'f'(或'A'-'F')
3、用户能输入的都是字符,即:'0'-'9', 'a'-'f'(或'A'-’F'), 需要转换成对应的数值 0-15;
4、getchar确实只能输入字符,这里需要的就是 '0'-'9', 'a'-'f'(或'A'-’F')这几个字符,getchar得到的值(int)就是这几个字符的ascii码值48-57, 113-118(或81-86)
5、htoi,完成了将48-57, 113-118(或81-86) 转换成 0-15的职责