是哪出了问题?

fengwei8 2008-04-23 08:34:19
#include<stdio.h>

#define YES 1
#define NO 2

int htoi(char s[])
{
int hexdigit;
int i;
int inhex;
int n;

i = 0;
if (s[i] == '0')
{
++i;
if (s[i] == 'x' || s[i] == 'X')
{
++i;
}
}
n = 0;
inhex = YES;
for (; inhex == YES; ++i)
{
if (s[i] >= '0' && s[i] <= '9')
{
hexdigit = s[i] - '0';
}
else if (s[i] >= 'a' && s[i] <= 'f')
{
hexdigit = s[i] - 'a' + 10;
}
else if (s[i] >= 'A' && s[i] <= 'F')
{
hexdigit = s[i] - 'A' + 10;
}
else
{
inhex = NO;
}
if (inhex == YES)
{
n = 16 * n + hexdigit;
}
}
return n;
}

int main(void)
{
int n;
char str[5] = "OX24";

n = htoi(str);
printf("string = %s integer = %d\n", str, n);
return 0;
}

此题目要求是把由十六进制数字组成的字符串(包含可选的前缀0X或0x)转换为与之等价
的整型值。字符串中包含的数字包括0~9,a~f,A~F。
我输入OX24,但得到的结果确是0. 调试观看了内存的变化,本应在判断0X后,i=2,但是现在i=0,请问是哪出了问题呢?谢谢
...全文
81 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengwei8 2008-04-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 world007 的回复:]
对不起,我说错了,但是LZ你本身16进制转成10进制的方法是错误的吧
[/Quote]


谢谢,不是转换方法的问题,是O和0的问题。
fengwei8 2008-04-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 c_spark 的回复:]
char str[5] = "OX24";
转写为char str[5] ="0x24"这才是十六进制形式..
[/Quote]

谢谢,的确是O和0的问题。
c_spark 2008-04-23
  • 打赏
  • 举报
回复
char str[5] = "OX24";
转写为char str[5] ="0x24"这才是十六进制形式..
world007 2008-04-23
  • 打赏
  • 举报
回复
对不起,我说错了,但是LZ你本身16进制转成10进制的方法是错误的吧
world007 2008-04-23
  • 打赏
  • 举报
回复
原因出在n上:
比如OX24转化成10进制是:2*16+4
你现在是n=0
c_spark 2008-04-23
  • 打赏
  • 举报
回复
十六进制是以0x开头,lz却是以'O'开头的
在程序只作了'0'开头的处理,所以在进入循环时s[i] = 'O'导致inhex = NO;没有转换

69,373

社区成员

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

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