2017-06-26 63 views
0

我已经写了这个半htoi函数在c,它采用一个十六进制字符串,并将其变成十六进制int。写作函数htoi的逻辑错误

*如果我解决这个问题,我可以把它转化为现实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工作

+2

第二和第三种情况下不转字母成若干 –

+0

第三情况下,不这样做正确的。 'a = a * 16 + c -'a'+ 10' –

+0

plz给我正确的代码 – arianpress

回答

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()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 
$ 
+0

感谢您关注'isxdigit()'。 –