果壳c100吧 关注:23贴子:30
  • 12回复贴,共1

【提问】关于十六进制转十进制的一些疑惑

只看楼主收藏回复

我原先的代码是这样的:
#include<stdio.h>
#define MAXLINE 1000
#include<math.h>
#include<ctype.h>
int htoi(char s[])
{
int i=2,j,c,n;
for(j=0;s[j]!='\n'&&s[j]!='\0';j++)
;
for(i=2;i<=j;i++)
{
c=s[i];
switch(c)
{case 'a':case 'A':
n=n+10*pow(16,j-i-1);
break;
case 'b':case 'B':
n=n+11*pow(16,j-i-1);
break;
case 'c':case 'C':
n=n+12*pow(16,j-i-1);
break;
case 'd':case 'D':
n=n+13*pow(16,j-i-1);
break;
case 'e':case 'E':
n=n+14*pow(16,j-i-1);
break;
case 'f':case 'F':
n=n+15*pow(16,j-i-1);
break;
default:
n=n+c*pow(16,j-i-1);
}
}
return n;
}
main()
{
int c=0, i=0;
long j=0;
char s[MAXLINE];
for(i=0;i<=MAXLINE;i++)
s[i]=0;
i=0;
for(i=0;(c=getchar())!='\0'&&c!='\n';i++)
s[i]=c;
printf("%ld", j=htoi(s));
}
这貌似正确,但会输出很神奇的答案,如:输入 ox1,输出 49...
将switch 里的 default部分换成:
case '1':
n=n+1*pow(16,j-i-1);
break;
case '2':
n=n+2*pow(16,j-i-1);
break;
case '3':
n=n+3*pow(16,j-i-1);
break;
case '4':
n=n+4*pow(16,j-i-1);
break;
case '5':
n=n+5*pow(16,j-i-1);
break;
case '6':
n=n+6*pow(16,j-i-1);
break;
case '7':
n=n+7*pow(16,j-i-1);
break;
case '8':
n=n+8*pow(16,j-i-1);
break;
case '9':
n=n+9*pow(16,j-i-1);
break;
case '0':
n=n;
break;
后则可以完美输出。不是很明白为什么。
向各位大神,助教老师求教


IP属地:北京1楼2016-09-23 22:28回复
    另外,题目要求是输出函数,那么一定要把main 部分写出来吗?


    IP属地:北京2楼2016-09-23 22:30
    收起回复
      另外 数字字符转化为数字 可以直接 x-'0' 例如字符'8'转化为数字8 直接'8'-'0'就行 不用写那么多case


      IP属地:上海3楼2016-09-24 12:17
      收起回复
        default: n=n+c*pow(16,j-i-1);此处c是个字符 不是数字,字符c的值不是原来的数字的值了


        4楼2016-09-24 12:54
        收起回复
          十六进制转十进制。。。用输入输出自带转换不就好了。。。进制转换那道题你可以再写手工转换


          IP属地:北京来自Android客户端5楼2016-09-24 13:10
          收起回复
            用%x读取%d输出就行了 简单粗暴🙈


            IP属地:北京来自iPhone客户端6楼2016-09-24 14:57
            收起回复