[C] for Schleife macht Probleme

smokydog

Grünschnabel
Also mein Problem ist folgendes:
Ich habe einen String der in HEX umgewandelt werden soll z.B. F4F29C1E03.
Leider macht die for-Schleife kein Stop beim Ende des Strings.
Vielleicht weiss einer auch wie ich Ergebniss also HexString zurückgeben kann.
Ich bin leider noch etwas unerfahren und suche hilfe.


Code:
//Funktion fand ich im Internet
int str_length(const char string[]) {
     int number = 0;               

     while (string[number] != '\0')               
         number++;                      
     return number;                            
}

void conv_str_to_hex(char string[]){
   int i;
   char tmp[1];
   char tmp1;   
   for(i = 0; i < str_length(string); i++){
         tmp[0]=string[i];
         tmp[1]=string[i+1];
         sscanf(tmp,"%x",&tmp1);
         // vllt so?
         // rückgabestring[i/2] = tmp1;
         printf("%x %d\n" ,tmp1,i);
         i++;
   }
}
 
Ok, wo fangen wir an... Das ist einiges an Fehlern ;)

1. Die Bedingung einer for-schleife wird bei JEDEM Schleifendurchlauf ausgeführt.
Deine Bedingung lautet: i < str_length(string); das bedeutet das für jedes einzelne Zeichen des Strings die Funktion str_length aufgerufen wird. ebenso gut könntest Du die Länge des Strings einfach vor der Schleife berrechnen, Beispiel:

Code:
int length = str_length(string);
for(i = 0; i < length; i++)

2. Es gibt eine simple Funktion: strlen ...

3. Normalerweise nimmt man als Datentyp char* string und nciht char string[] (Auch wenn das unterm Strich aufs gleiche hinausläuft)

Nun zum eigendlichen Fehler, der ist ganz gut versteckt und fällt eher unter: Zufallsprodukt. Hätte ebensogut ein Programmcrash werden können.


Du definierst ein char-array mit der Länge 1
Code:
char tmp[1];

Länge 1 bedeutet, das genau 1 (ein) Zeichen in dieses Array passt. Eins wie in eins, nicht 2, nicht 3, sondern 1 ;)

Dann aber greifst Du auf die zweite Stelle im array zu:
Code:
tmp[1]=string[i+1];

Auf die zweite Stelle eines Arrays mit genau einer Stelle zugreifen bedeutet, Du greifst auf undefinierten Speicher zu udn was immer gerade darin steht, das veränderst Du. In Deinem Falll ist das zufällig ein Teil der Laufvariable (i) die dadurch zufällig imemr weider auf 0 zurückgesetzt wird, daher Endlosschleife. Aber wie gesagt, das ist tatsächlich purer Zufall...

Arrays sind 0-basiert in C, das bedeutet, die erste Stelle des Arrays hat den Index 0, die ZWEITE Stelle den Index 1. deine Array-definition müsste also so aussehen:

Code:
char tmp[2];

dann gehts...
 
Zurück