写一函数,输入一个十六进制数,输出相应的十进制数。编译成功,调试结果出错

尼古拉斯罗本 2015-05-23 06:24:26
问题:写一函数,输入一个十六进制数,输出相应的十进制数。编译成功,调试结果出错,这是《c语言程序设计》课后题上面的原题,按答案敲,对了好几编没有错误。但是总是调试没有相应结果,求大神帮助~
代码和截图如下:
#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);
}


...全文
3966 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
尼古拉斯罗本 2015-07-09
  • 打赏
  • 举报
回复
此贴未解决。
yhlzxq 2015-05-29
  • 打赏
  • 举报
回复
这样写太复杂了,用个简单的办法。
赵4老师 2015-05-25
  • 打赏
  • 举报
回复
仅供参考:
#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汉
纹枰老妖 2015-05-25
  • 打赏
  • 举报
回复
引用 16 楼 u013409439 的回复:
[quote=引用 15 楼 wenpinglaoyao 的回复:]
[quote=引用 14 楼 u013409439 的回复:]
[quote=引用 11 楼 wenpinglaoyao 的回复:]
[quote=引用 10 楼 u013409439 的回复:]
[quote=引用 8 楼 tianxia2s 的回复:]
七楼正确,运行了楼主的代码,发现结果与楼主的结果不同,当时感觉就是好奇怪。

你什么都没有改吗?删掉楼上那个还是不行、[/quote]
先看结果:[/quote]

问题来了,二者编译的结果并没有任何变化啊~![/quote]

有变化吧,最起码我把那句【getchar】给注释掉了。。。[/quote]
亲,真的没有,你把注释拿掉试试[/quote]

注释去掉了,结果如图所示:
尼古拉斯罗本 2015-05-25
  • 打赏
  • 举报
回复
引用 15 楼 wenpinglaoyao 的回复:
[quote=引用 14 楼 u013409439 的回复:] [quote=引用 11 楼 wenpinglaoyao 的回复:] [quote=引用 10 楼 u013409439 的回复:] [quote=引用 8 楼 tianxia2s 的回复:] 七楼正确,运行了楼主的代码,发现结果与楼主的结果不同,当时感觉就是好奇怪。
你什么都没有改吗?删掉楼上那个还是不行、[/quote] 先看结果:[/quote] 问题来了,二者编译的结果并没有任何变化啊~![/quote] 有变化吧,最起码我把那句【getchar】给注释掉了。。。[/quote] 亲,真的没有,你把注释拿掉试试
纹枰老妖 2015-05-25
  • 打赏
  • 举报
回复
引用 14 楼 u013409439 的回复:
[quote=引用 11 楼 wenpinglaoyao 的回复:] [quote=引用 10 楼 u013409439 的回复:] [quote=引用 8 楼 tianxia2s 的回复:] 七楼正确,运行了楼主的代码,发现结果与楼主的结果不同,当时感觉就是好奇怪。
你什么都没有改吗?删掉楼上那个还是不行、[/quote] 先看结果:[/quote] 问题来了,二者编译的结果并没有任何变化啊~![/quote] 有变化吧,最起码我把那句【getchar】给注释掉了。。。
尼古拉斯罗本 2015-05-25
  • 打赏
  • 举报
回复
引用 11 楼 wenpinglaoyao 的回复:
[quote=引用 10 楼 u013409439 的回复:] [quote=引用 8 楼 tianxia2s 的回复:] 七楼正确,运行了楼主的代码,发现结果与楼主的结果不同,当时感觉就是好奇怪。
你什么都没有改吗?删掉楼上那个还是不行、[/quote] 先看结果:[/quote] 问题来了,二者编译的结果并没有任何变化啊~!
尼古拉斯罗本 2015-05-24
  • 打赏
  • 举报
回复
引用 8 楼 tianxia2s 的回复:
七楼正确,运行了楼主的代码,发现结果与楼主的结果不同,当时感觉就是好奇怪。
你什么都没有改吗?删掉楼上那个还是不行、
尼古拉斯罗本 2015-05-24
  • 打赏
  • 举报
回复
引用 7 楼 wenpinglaoyao 的回复:
哎,现在的人啊,太浮躁! 楼上的网友根本就不认真回答楼主的问题,你们认为扔给他一个备胎就能让他安心忘记这个疑惑了??这完全是授人鱼或授人渔的问题好吗?楼主,您的代码问题全处在第25行代码【c = getchar()】上,因为它的存在,多喝掉您一个输入,仅此而已
怎么处理?删掉吗?删掉编译结果还是这样~
纹枰老妖 2015-05-24
  • 打赏
  • 举报
回复
引用 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);
}
纹枰老妖 2015-05-24
  • 打赏
  • 举报
回复
引用 10 楼 u013409439 的回复:
[quote=引用 8 楼 tianxia2s 的回复:]
七楼正确,运行了楼主的代码,发现结果与楼主的结果不同,当时感觉就是好奇怪。

你什么都没有改吗?删掉楼上那个还是不行、[/quote]
先看结果:
zzzzzzzaxiba 2015-05-23
  • 打赏
  • 举报
回复
七楼正确,运行了楼主的代码,发现结果与楼主的结果不同,当时感觉就是好奇怪。
纹枰老妖 2015-05-23
  • 打赏
  • 举报
回复
哎,现在的人啊,太浮躁! 楼上的网友根本就不认真回答楼主的问题,你们认为扔给他一个备胎就能让他安心忘记这个疑惑了??这完全是授人鱼或授人渔的问题好吗?楼主,您的代码问题全处在第25行代码【c = getchar()】上,因为它的存在,多喝掉您一个输入,仅此而已
brookmill 2015-05-23
  • 打赏
  • 举报
回复
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",不过这不是本质问题。
尼古拉斯罗本 2015-05-23
  • 打赏
  • 举报
回复
引用 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
这是书上课后题的答案~
尼古拉斯罗本 2015-05-23
  • 打赏
  • 举报
回复
引用 3 楼 yaojuntong77 的回复:
[quote=引用 2 楼 yaojuntong77 的回复:] 是的,代码太麻烦了,你看看这个函数合用不:
百度百科:sprintf函数 原型 int sprintf( char *buffer, const char *format, [ argument] … ); 参数列表 buffer:char型指针,指向将要写入的字符串的缓冲区。 format:格式化字符串。 [argument]...:可选参数,可以是任何类型的数据。 返回值 字符串长度(strlen) 入参用一个字符串,检测用户是不是输入的十六进制格式,并且确保切掉用户输入的首部0x记号, 然后设置一个十六进制转十进制函数,出参最好设置成堆上动态申请的字符串,外部输出限时完成后由调用方释放该字符串的堆内存;这样可以确保用户输入的数据过大时,常规整型容纳不下的问题 当然咯,你也可以用普通方式记录下来,然后输出转换后的字符串,这样就不用动态申请内存了 刚才一不小心点了:[Ctrl] + [Enter] [/quote] 额额,我还没有看到指针~~
布拉格曼 2015-05-23
  • 打赏
  • 举报
回复
引用 2 楼 yaojuntong77 的回复:
是的,代码太麻烦了,你看看这个函数合用不:
百度百科:sprintf函数 原型 int sprintf( char *buffer, const char *format, [ argument] … ); 参数列表 buffer:char型指针,指向将要写入的字符串的缓冲区。 format:格式化字符串。 [argument]...:可选参数,可以是任何类型的数据。 返回值 字符串长度(strlen) 入参用一个字符串,检测用户是不是输入的十六进制格式,并且确保切掉用户输入的首部0x记号, 然后设置一个十六进制转十进制函数,出参最好设置成堆上动态申请的字符串,外部输出限时完成后由调用方释放该字符串的堆内存;这样可以确保用户输入的数据过大时,常规整型容纳不下的问题 当然咯,你也可以用普通方式记录下来,然后输出转换后的字符串,这样就不用动态申请内存了 刚才一不小心点了:[Ctrl] + [Enter]
布拉格曼 2015-05-23
  • 打赏
  • 举报
回复
是的,代码太麻烦了,你看看这个函数合用不:
苏叔叔 2015-05-23
  • 打赏
  • 举报
回复
你这太麻烦了,

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

69,335

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧