写作函数htoi的逻辑错误

时间:2017-06-26 18:48:22

标签: c

我在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 + ca = a * 10 + c

int a = 0x0int a = 0 它像atoi一样工作

1 个答案:

答案 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