Merkwürdige Länge von char-Arrays
-
Hallo zusammen,
habe wieder mal ein merkwürdiges Problem im Zusammenhang mit char-Arrays. Ich möchte gerne in eine 40 Zeichen lange Zeichenkette mit dem Namen "ziel" einen (hex-)String so ablegen, dass die führenden Stellen von "ziel" mit '0' aufgefüllt werden. Dazu hab ich mir folgendes zusammengebastelt:
int z = 40; // Anzahl der Stellen char* ziel = new char[z]; char* hex = "ffffffff"; int l = strlen(hex); // führende Nullen for (int i = 0; i < z - l; i++) ziel[i] = '0'; // Rest int j = 0; for (int i = z - l; i < z; i++) { ziel[i] = hex[j]; j++; }Das Problem ist nun, dass ich nicht nur das gewünschte 40 Zeichen lange Ergebnis erhalte, sonderen das gewünschte Ergebnis plus fünf weiter Zeichen, also z.B. "00000000000000000000000000000000fffffffferla?" oder "00000000000000000000000000000000ffffffffter[1" anstelle von "00000000000000000000000000000000ffffffff". Liegt das vielleicht daran, dass ich Zeiger auf die chars verwende? Allerdings müssen es hier Zeiger sein, denn eigentlich soll der obige Code in einer Funktion stehen, die "hex" als Argument übergeben bekommt...
Wäre mal wieder sehr dankbar über jeden Hinweis...
-
Du musst ihm auch sagen dass der char irgendwo zuende ist (durch das Zeichen '\0'). C weiss intern nicht ob in dem 40-stelligen Feld null, ein, fünf, 40 oder 50 Zeichen Text stehen.
-
Vielen Dank für die Hilfe, LordJaxom. Ich habe jetzt einfach '\0' an Stelle 40 des Arrays gesetzt, was ja jenseits von dessen Grenze liegt. Jetzt funktioniert es prima, aber überschreibt man so eigentlich nicht irgendetwas anderes an dieser Stelle im Speicher?
-
Ja, eigentlich überschreibst du damit fremden Speicher (bzw. kannst nicht sicher sein, ob dir das nächste new dein Stringende abschneidet) - du solltest also besser genügend Platz für den String inklusive Endezeichen reservieren (mit "ziel=new char[z+1];").
-
Hallo
richtig erkannt, damit überschreitest du die Grenzen des Arrays und erzeugst Fehler.
C-Arrays müßen deshalb immer um eins länger sein als effektiv Zeichen vorhanden sein sollen. Damit das abschließende '\0' reinpasst.bis bald
akari