C-code zu konvertieren hex zu int
Schreibe ich diesen code umwandeln eines hex-Eintrag in die Ganzzahl entspricht. So Eine würde 10 und B 11 etc. Dieser code wirkt sonderbar, dass es den seg. Störungen an beliebigen stellen und darunter eine extra newline character mal wird es bekommen, um zu arbeiten. Ich versuche zu Debuggen, nur damit ich verstehen kann, was mache ich hier falsch. Kann jemand ein Blick werfen und mir hier helfen ? Vielen Dank für Ihre Zeit.
/* Feste funktionierenden code für alle interessierten */
#include <stdio.h>
#include <stdlib.h>
unsigned int hextoint(const char temp[])
{
int i;
int answer = 0;
int dec;
char hexchar[] = "aAbBcCdDeEfF" ;
for ( i=0; temp[i] != '\0'; i++ )
{
if ( temp[i] == '\0')
{
return ;
}
if (temp[i] == '0' || temp[i] == 'x' || temp[i] == 'X' )
{
printf("0");
answer = temp[i];
}
//compare each temp[i] with all contents in hexchar[]
int j;
int a = temp[i];
for ( j=0; hexchar[j] != '\0'; j++)
{
if ( temp[i] == hexchar[j] )
{
answer *= 16;
answer = answer + 10 + (j/2);
// printf("%d\n",answer );
break;
}
}
}
return answer;
}
main()
{
char *test[] =
{ "bad",
"aabbdd"
"0100",
"0x1",
"0XA",
"0X0C0BE",
"abcdef",
"123456",
"0x123456",
"deadbeef",
"zog_c"
};
int answer=0;
//Calculate the number of char's.
int numberOfChars;
numberOfChars = sizeof test /sizeof test[0];
printf("main():Number of chars = %d\n",numberOfChars);
int i;
//Go through each character and convert Hex to Integers.
for ( i = 0; i<numberOfChars;i++)
{
//Need to take the first char and then go through it and convert
it.
answer = hextoint(test[i]);
printf("%d\n",answer );
}
}
- Haben Sie versucht, Durchlaufen Sie eine Zeile zu einem Zeitpunkt mit einem debugger, um zu sehen, wo das Verhalten abweicht von dem, was Sie beabsichtigten?
- Wenn dies eine Funktion, die Sie brauchen für etwas anderes (eher als nur eine übung in schreiben eines hex zu int converter), werfen Sie einen Blick auf die
strtol
- Funktion in der standard-Bibliothek. - sizeof(test) und sizeof(test[0]) haben die gleiche Größe. Sie sind beide Zeiger
- Oli, ich habe. Und gdb sagt, dass es stürzt bei for ( i=0; temp[i] != '\0'; i++ ) als auch der Arbeitsspeicher ist out of bounds. Aber ich finde das Verhalten komisch, und bin nicht in der Lage, um herauszufinden, warum das mem. ist out of bounds.
- Phil, ich bin versucht zu Debuggen, um besser zu verstehen, C und sehen, wohin ich gehe falsch. Ich don ' T wollen, verwenden Sie die standard-Bibliotheken. Dank
- Sind Sie sicher, dass das char-array ist null-terminiert?
- Was bedeutet
numberOfChars
enthalten nach der Ausführung der Zuweisung? - Ich würde vorschlagen, zu erforschen, was der Wert von
i
ist, wenn es abstürzt und wie man diese vergleicht, wie lange Sie denken, dass die Zeichenfolge sein sollte. Und dann arbeiten Sie heraus, warum, zum Beispiel, der string ist nicht mehr null-terminiert ist (wenn das wird das Problem sein).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Let ' s take a look.
Scheint dies nicht einmal versuchen zu tun, und keine Konvertierung. Es sollte immer 0 zurück, da
answer
ist nie vergeben einen beliebigen anderen Wert. Normalerweise würden Sie so etwas tun:Wo
digit_value
(natürlich genug) gibt den Wert einer einzelnen Ziffer. Ein Weg dies zu tun ist:Dann, Blick auf
main
:Hängt von den "impliziten " int" - Regel ist in der Regel schlechte Praxis, zumindest IMO. Es ist viel besser, geben Sie den Rückgabetyp.
Diese tatsächlich berechnet die Anzahl der Saiten, nicht die Anzahl der
char
s.Gültigen Indizes laufen von 0 bis Anzahl der Elemente - 1, so dass diese zu Lesen versucht, hinter das Ende des Arrays (was zu undefiniertem Verhalten).
A
zuF
.Diese arbeiten werden für eine beliebige Anzahl innerhalb von unsigned int reichen, das schöne daran ist, dass es keine andere library-Funktionen, so ist es ideal für Mikro-Controller, wo der Platz knapp ist.
Ist das problem mit der Berechnung von
numberOfChars
Teil.sizeof test
ist eigentlich die Größe der Zeiger, nicht die Gesamtlänge aller Zeichen in das array, so dass die zurückgegebene Anzahl ist in deinem code wäre 1, das macht die for-Schleife gehen Sie auf die zweite index-test (test[1]
), die nicht über eine\0
am Ende. Versuchen Sie es mitstrlen
für die BerechnungnumberOfChars
.test
ist definiert als ein array von Zeigern,sizeof test
liefert die Anzahl der bytes im array.sizeof(test[0])
ergibt die Größe eines einzelnen-Zeiger in das array. Division gibt die Anzahl der Zeiger.Diese können mir nicht die optimale Methode, aber es sollte funktionieren ohne problem.