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
$
Der zweite und der dritte Fall, den Brief in eine Anzahl –
der dritte Fall nicht dreht nicht, das zu tun richtig entweder. 'a = a * 16 + c -'a '+ 10' –
PLZ geben Sie mir den richtigen Code – arianpress