gpt4 book ai didi

c - 编写函数 htoi 时的逻辑错误

转载 作者:太空宇宙 更新时间:2023-11-04 08:02:56 25 4
gpt4 key购买 nike

我用 c 编写了这个 semi-htoi 函数,它接受一个十六进制字符串并将其转换为十六进制 int。

*如果我更正这个,我可以把它变成真正的 htoi 函数

#include<stdio.h>

int main(void)
{
char c;
int a = 0x0;
//a += 1;if do this, we have added 1 to 0 hexadecimal
while((c = getchar()) != '`')
{
if((c >= '0') && (c <= '9')){
a = a * 16 + (c - '0');
printf("a is:%x c:%c\n", a, c);
}
else if((c >= 'a') && (c <= 'f')){
a = a * 16 + c;
printf("a is:%x c:%c\n", a, c);
}
else if((c >= 'A') && (c <= 'F')){
a = a * 16 + c;
printf("a is:%x c:%c\n", a, c);
}
}
printf("\nyour hexa number is:\n%hhx\n", a);
return 0;
}

但它不起作用,而如果我改变a = a * 16 + ca = a * 10 + c

整数 a = 0x0int a = 0它像 atoi 一样工作

最佳答案

一个问题是你的 printf()声明:

printf("\nyour hexa number is:\n%hhx\n", a);

%hhx转换规范说“将参数视为 unsigned char '.那不是你想要的。你应该使用:

printf("\nyour hexa number is: %x\n", a);

(我用空格替换了冒号后的换行符——这样输出看起来会更好。这不是必要的更改。)

另一个问题是十六进制字符的转换代码,如注释中所述。

还有一个问题是 getchar()返回 int而不是 char .参见 while ((c = getc(file)) != EOF) loop won't stop executing更多细节。此外,您的循环应该在 EOF 处终止,并且也可能在换行符处终止。您在反引号处停止而不会产生错误;你忽略其他非十六进制字符。

您还应该考虑使用 isdigit()isxdigit()也许tolower()toupper()来自 <ctype.h> . a .. f检查适用于所有 ASCII 和 EBCDIC 代码集,但如果您测试的范围更大(例如 a .. i ),那么您的比较对于 EBCDIC 将不可靠。

将所有建议放在一起,我会产生更像这样的东西:

#include <stdio.h>
#include <ctype.h>

int main(void)
{
int c;
int a = 0x0;
while ((c = getchar()) != '`' && c != EOF && c != '\n')
{
if (isdigit(c))
{
a = a * 16 + (c - '0');
printf("a is: %x c:%c\n", a, c);
}
else if (isxdigit(c))
{
a = a * 16 + (toupper(c) - 'A' + 10);
printf("a is: %x c:%c\n", a, c);
}
else
{
printf("'%c' is not a hexadecimal digit\n", c);
break;
}
}
printf("\nYour hexadecimal number is: %x\n", a);
return 0;
}

我很想删除反引号测试,让“非十六进制数字”代码处理它。

hx53 的样本运行— 从 hx53.c 创建并使用 Bash here strings提供输入:

$ hx53 <<< 'a32419fC'
a is: a c:a
a is: a3 c:3
a is: a32 c:2
a is: a324 c:4
a is: a3241 c:1
a is: a32419 c:9
a is: a32419f c:f
a is: a32419fc c:C

Your hexadecimal number is: a32419fc
$ hx53 <<< 'a32419`fC'
a is: a c:a
a is: a3 c:3
a is: a32 c:2
a is: a324 c:4
a is: a3241 c:1
a is: a32419 c:9

Your hexadecimal number is: a32419
$ hx53 <<< 'a32419XfC'
a is: a c:a
a is: a3 c:3
a is: a32 c:2
a is: a324 c:4
a is: a3241 c:1
a is: a32419 c:9
'X' is not a hexadecimal digit

Your hexadecimal number is: a32419
$

关于c - 编写函数 htoi 时的逻辑错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44766663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com