2017-06-26 4 views
0

Ich habe diese Semi-Htoi-Funktion in c geschrieben, die eine hexadezimale Zeichenfolge und verwandelt es in hexadezimale int.logischer Fehler beim Schreiben der Funktion htoi

* wenn ich dies zu korrigieren, kann ich es auf reale htoi Funktion drehen

#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; 
} 

aber es funktioniert nicht, während, wenn ich a = a * 16 + c zu a = a * 10 + c

und int a = 0x0 ändern int a = 0 es funktioniert als Atoi

+2

Der zweite und der dritte Fall, den Brief in eine Anzahl –

+0

der dritte Fall nicht dreht nicht, das zu tun richtig entweder. 'a = a * 16 + c -'a '+ 10' –

+0

PLZ geben Sie mir den richtigen Code – arianpress

Antwort

2

Ein Problem ist Ihre printf() Aussage:

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

Die %hhx Umwandlung Spezifikation 'behandelt das Argument als unsigned char' sagt. Das ist nicht was du willst. Sie sollten verwenden:

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

(ich das Newline nach dem Doppelpunkt durch ein Leerzeichen ersetzt - der Ausgang besser aussehen wird auf diese Weise ist es nicht eine notwendige Veränderung..)

Ein weiteres Problem ist der Conversion-Code für hexadezimale Zeichen, wie in den Kommentaren dokumentiert.

Ein weiteres Problem ist, dass getchar() eine int und nicht eine char zurückgibt. Weitere Informationen finden Sie unter while ((c = getc(file)) != EOF) loop won't stop executing. Außerdem sollte Ihre Schleife bei EOF enden und wahrscheinlich auch bei Newline enden. Sie stoppen auf einem Back-Tick, ohne einen Fehler zu erzeugen; Sie ignorieren andere nicht hexadezimale Zeichen.

Sie sollten auch von <ctype.h> mit isdigit() und isxdigit() und vielleicht tolower() oder toupper() betrachten. Die Prüfung a .. f funktioniert bei allen ASCII- und EBCDIC-Codesätzen, aber wenn Sie einen viel größeren Bereich testen würden (z. B. a .. i), wäre Ihr Vergleich für EBCDIC nicht zuverlässig.

Putting alle Vorschläge zusammen, würde ich etwas mehr wie folgt produzieren:

#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; 
} 

ich sehr versucht sein, würde den Test für Back-Angebot zu entfernen und die ‚nicht eine hexadezimale Ziffer‘ Code Deal lassen damit.

Beispielläufe hx53 - erstellt von hx53.c und mit Bash here strings die Eingabe bieten:

$ 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

Danke, dass du meine Aufmerksamkeit auf 'isxdigit()' gelenkt hast. –