我在c中写了这个半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 + c
至
a = a * 10 + c
和
int a = 0x0
至
int a = 0
它像atoi一样工作
答案 0 :(得分:2)
一个问题是您的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()
的{{1}}和isxdigit()
以及tolower()
或toupper()
。 <ctype.h>
.. a
检查适用于所有ASCII和EBCDIC代码集,但如果您测试的范围要大得多(例如f
.. a
),那么比较对于EBCDIC来说是不可靠的。
将所有建议放在一起,我会产生更像这样的东西:
i
我很想删除反引号的测试,并让'不是十六进制数字'代码处理它。
#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
创建并使用Bash here strings提供输入:
hx53.c