user-0 提问: 写一函数，输入一个十六进制数，输出相应的十进制数。编译成功，调试结果出错

回复:
user: user-0
content: 此贴未解决。

user: user-1
content: 这样写太复杂了，用个简单的办法。

user: user-2
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉

user: user-3
content: 引用 16 楼 u013409439 的回复:[quote=引用 15 楼 wenpinglaoyao 的回复:] [quote=引用 14 楼 u013409439 的回复:] [quote=引用 11 楼 wenpinglaoyao 的回复:] [quote=引用 10 楼 u013409439 的回复:] [quote=引用 8 楼 tianxia2s 的回复:] 七楼正确，运行了楼主的代码，发现结果与楼主的结果不同，当时感觉就是好奇怪。 你什么都没有改吗？删掉楼上那个还是不行、[/quote] 先看结果：[/quote]  问题来了，二者编译的结果并没有任何变化啊~！[/quote]  有变化吧，最起码我把那句【getchar】给注释掉了。。。[/quote] 亲，真的没有，你把注释拿掉试试[/quote]  注释去掉了，结果如图所示：

user: user-0
content: 引用 15 楼 wenpinglaoyao 的回复:[quote=引用 14 楼 u013409439 的回复:] [quote=引用 11 楼 wenpinglaoyao 的回复:] [quote=引用 10 楼 u013409439 的回复:] [quote=引用 8 楼 tianxia2s 的回复:] 七楼正确，运行了楼主的代码，发现结果与楼主的结果不同，当时感觉就是好奇怪。 你什么都没有改吗？删掉楼上那个还是不行、[/quote] 先看结果：[/quote]  问题来了，二者编译的结果并没有任何变化啊~！[/quote]  有变化吧，最起码我把那句【getchar】给注释掉了。。。[/quote] 亲，真的没有，你把注释拿掉试试

user: user-3
content: 引用 14 楼 u013409439 的回复:[quote=引用 11 楼 wenpinglaoyao 的回复:] [quote=引用 10 楼 u013409439 的回复:] [quote=引用 8 楼 tianxia2s 的回复:] 七楼正确，运行了楼主的代码，发现结果与楼主的结果不同，当时感觉就是好奇怪。 你什么都没有改吗？删掉楼上那个还是不行、[/quote] 先看结果：[/quote]  问题来了，二者编译的结果并没有任何变化啊~！[/quote]  有变化吧，最起码我把那句【getchar】给注释掉了。。。

user: user-0
content: 引用 11 楼 wenpinglaoyao 的回复:[quote=引用 10 楼 u013409439 的回复:] [quote=引用 8 楼 tianxia2s 的回复:] 七楼正确，运行了楼主的代码，发现结果与楼主的结果不同，当时感觉就是好奇怪。 你什么都没有改吗？删掉楼上那个还是不行、[/quote] 先看结果：[/quote]  问题来了，二者编译的结果并没有任何变化啊~！

user: user-0
content: 引用 8 楼 tianxia2s 的回复:七楼正确，运行了楼主的代码，发现结果与楼主的结果不同，当时感觉就是好奇怪。 你什么都没有改吗？删掉楼上那个还是不行、

user: user-0
content: 引用 7 楼 wenpinglaoyao 的回复:哎，现在的人啊，太浮躁！ 楼上的网友根本就不认真回答楼主的问题，你们认为扔给他一个备胎就能让他安心忘记这个疑惑了？？这完全是授人鱼或授人渔的问题好吗？楼主，您的代码问题全处在第25行代码【c = getchar()】上，因为它的存在，多喝掉您一个输入，仅此而已  怎么处理？删掉吗？删掉编译结果还是这样~

user: user-3
content: 引用 9 楼 u013409439 的回复:[quote=引用 7 楼 wenpinglaoyao 的回复:] 哎，现在的人啊，太浮躁！ 楼上的网友根本就不认真回答楼主的问题，你们认为扔给他一个备胎就能让他安心忘记这个疑惑了？？这完全是授人鱼或授人渔的问题好吗？楼主，您的代码问题全处在第25行代码【c = getchar()】上，因为它的存在，多喝掉您一个输入，仅此而已  怎么处理？删掉吗？删掉编译结果还是这样~[/quote] 再看代码【照抄您的，做了一点小小改变，注释了那句getchar】：  #include<stdio.h> #define MAX 1000 void main() {     int htoi(char s[]);     int c, i, flag, flag1;     char t[MAX];     i = 0;      flag = 0;     flag1 = 1;     printf("\ninput a HEX number:");     while ((c = getchar() )!= '\0'&&i < MAX && flag1)     {          if (c >= '0' && c <= '9' || c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F')         {             flag = 1;             t[i++] = c;         }         else if (flag)         {             t[i] = '\0';             printf("decimal number %d:\n", htoi(t));             printf("continue or not?");             //c = getchar();             if (c == 'N' || c == 'n')                 flag1 = 0;             else             {                 flag = 0;                 i = 0;                 printf("\ninput a HEX number:");             }         }     } }   int 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); }

user: user-3
content: 引用 10 楼 u013409439 的回复:[quote=引用 8 楼 tianxia2s 的回复:] 七楼正确，运行了楼主的代码，发现结果与楼主的结果不同，当时感觉就是好奇怪。 你什么都没有改吗？删掉楼上那个还是不行、[/quote] 先看结果：

user: user-4
content: 七楼正确，运行了楼主的代码，发现结果与楼主的结果不同，当时感觉就是好奇怪。

user: user-3
content: 哎，现在的人啊，太浮躁！ 楼上的网友根本就不认真回答楼主的问题，你们认为扔给他一个备胎就能让他安心忘记这个疑惑了？？这完全是授人鱼或授人渔的问题好吗？楼主，您的代码问题全处在第25行代码【c = getchar()】上，因为它的存在，多喝掉您一个输入，仅此而已

user: user-5
content: 1. 建议给这一行加几个括号         if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')) 我不记得&&和||的优先级，加了括号踏实一点。  2. 如果出错有两个可能：htoi出错，或者输入部分出错。建议在htoi一开始就printf("%s\n", s);这样就可以判断是哪边的问题。 目测htoi感觉没错。我个人习惯把后两个if改成“else if"，不过这不是本质问题。

user: user-0
content: 引用 1 楼 zhangxiangDavaid 的回复:你这太麻烦了，  int main(void) { 	char str[11]; 	scanf("%s", str); 	long l; 	sscanf(str, "%x", &l); 	printf("l=%d\n", l); 	return 0; } //16 //l=22  这是书上课后题的答案~

user: user-0
content: 引用 3 楼 yaojuntong77 的回复:[quote=引用 2 楼 yaojuntong77 的回复:] 是的，代码太麻烦了，你看看这个函数合用不：  百度百科：sprintf函数 原型 int sprintf( char *buffer, const char *format, [ argument] … ); 参数列表 buffer：char型指针，指向将要写入的字符串的缓冲区。 format：格式化字符串。 [argument]...：可选参数，可以是任何类型的数据。 返回值 字符串长度（strlen）  入参用一个字符串，检测用户是不是输入的十六进制格式，并且确保切掉用户输入的首部0x记号， 然后设置一个十六进制转十进制函数，出参最好设置成堆上动态申请的字符串，外部输出限时完成后由调用方释放该字符串的堆内存；这样可以确保用户输入的数据过大时，常规整型容纳不下的问题  当然咯，你也可以用普通方式记录下来，然后输出转换后的字符串，这样就不用动态申请内存了   刚才一不小心点了：[Ctrl] + [Enter] [/quote] 额额，我还没有看到指针~~

user: user-6
content: 引用 2 楼 yaojuntong77 的回复:是的，代码太麻烦了，你看看这个函数合用不：  百度百科：sprintf函数 原型 int sprintf( char *buffer, const char *format, [ argument] … ); 参数列表 buffer：char型指针，指向将要写入的字符串的缓冲区。 format：格式化字符串。 [argument]...：可选参数，可以是任何类型的数据。 返回值 字符串长度（strlen）  入参用一个字符串，检测用户是不是输入的十六进制格式，并且确保切掉用户输入的首部0x记号， 然后设置一个十六进制转十进制函数，出参最好设置成堆上动态申请的字符串，外部输出限时完成后由调用方释放该字符串的堆内存；这样可以确保用户输入的数据过大时，常规整型容纳不下的问题  当然咯，你也可以用普通方式记录下来，然后输出转换后的字符串，这样就不用动态申请内存了   刚才一不小心点了：[Ctrl] + [Enter]

user: user-6
content: 是的，代码太麻烦了，你看看这个函数合用不：

user: user-7
content: 你这太麻烦了，  int main(void) { 	char str[11]; 	scanf("%s", str); 	long l; 	sscanf(str, "%x", &l); 	printf("l=%d\n", l); 	return 0; } //16 //l=22