2017-06-26 68 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()'。 –