char -> AnsiString -> Nullterminierung
-
Hallo zusammen,
hab folgende Probleme und mittlerweile Knoten im Gehiern:
1. Ich will einen char-Array anlegen (mit möglicherweise unbekannter
Größe, dazu aber weiter unten).
Wo ist also erstmal der Unterschied zwischen:char cTest[200];
und
int iSize = 200; char *cTest = new char[iSize];
abgesehen davon, dass die zweite Version das mit der unbekannten
Größe iSize ermöglicht.2. Das ist u.a. nämlich die Voraussetzung für Folgendes:
Eine Funktion benötigt zur Rückgabe eines Strings einen char-Array.
Mit der ersten oben genannten Version bekomme ich auch den kompletten
String, in welchem auch viele "\0"-Zeichen drin sind.
Für eine saubere Programmierung will ich die Größe iSize erst noch
abfragen, was aber mit der zweiten Methode nur den Text bis
zum ersten "\0" liefert.Ich brauch das, da ich den String in genau die Teile trennen muss,
welche durch die "\0"-Zeichen (auch mehrere hintereinander) getrennt
werden.Vielen Dank schon mal im Voraus...
contact
-
Es ist schon ein Unterschied, aber nicht das, was du beschreibst. Wer "liefert" etwas? Dein letzter Absatz ist absolut unverständlich.
-
contact schrieb:
Knoten im Gehiern
goto Grundschule
-
Da das hier das C++-Forum ist: wieso verwendest Du 'char[]' und nicht 'std::string' oder besser noch 'std::wstring'?
-
Konrad Rudolph schrieb:
Da das hier das C++-Forum ist: wieso verwendest Du 'char[]' und nicht 'std::string' oder besser noch 'std::wstring'?
Nicht immer kann man auf char[] verzichten. Du hast uebrigens noch vector<char>
vergessen aufzuzaehlen ;).abgesehen davon, dass die zweite Version das mit der unbekannten
Größe iSize ermöglicht.Die Groesse ist nicht unbekannt, du hast sie angegeben. Der unterschied ist,
dass bei der zweiten Variante iSize-Speicher im Heap reserviert wird und dir
ein Zeiger auf den Begin dieses Speicherbereiches geliefert wird. Du kannst
nun ueber den Zeiger auf diesen Speicherbereich zugreifen. Du musst auch
dafuer sorgen, dass dieser Speicherbereich spaeter wieder freigegeben wird.2. Das ist u.a. nämlich die Voraussetzung für Folgendes:
Eine Funktion benötigt zur Rückgabe eines Strings einen char-Array.
Mit der ersten oben genannten Version bekomme ich auch den kompletten
String, in welchem auch viele "\0"-Zeichen drin sind.Ok, soweit verstanden.
Für eine saubere Programmierung will ich die Größe iSize erst noch
abfragen, was aber mit der zweiten Methode nur den Text bis
zum ersten "\0" liefert.Hmmm...nicht verstanden. Du hast bei der zweiten Variante iSize Speicher
reserviert, warum also solltest du iSize nicht zur Verfuegung haben?Ich brauch das, da ich den String in genau die Teile trennen muss,
welche durch die "\0"-Zeichen (auch mehrere hintereinander) getrennt
werden.Schau dir dazu mal die Funktion strtok an oder, schau mal in die FAQ, ich
meine Hume hat dort mal was gepostet, was das gleiche mit 'string's macht.mfg
v R
-
Hi,
Also
1. es ist mit std::string möglich Nullterminierung zu umgehen
2. du könntest auch boost::tokenizer benutzen um einzelne Tokens zu bekommen.MfG eViLiSSiMo
-
virtuell Realisticer schrieb:
Konrad Rudolph schrieb:
Da das hier das C++-Forum ist: wieso verwendest Du 'char[]' und nicht 'std::string' oder besser noch 'std::wstring'?
Nicht immer kann man auf char[] verzichten. Du hast uebrigens noch vector<char>
vergessen aufzuzaehlen ;).Ich meinte für Strings. Verwendest Du 'vector<char>' (oder 'vector<wchar_t>') für einen String?
-
Es ging ja lediglich um ein Array. Ne, fuer Strings benutz ich kein vector<char>.
Glaube das waere mir ein wenig zu umstaendlich.
mfg
v R
-
Hm,
ich sehe, ich muss noch etwas präzizieren:
1.Eine Funktion will char* für den Rückgabewert!
2.Ich weiss was ich bekomme, e.g.: "blabla\0\0\0\0weiter_mit_blabla\0\0\0usw"
3.Weiss aber nicht wie lang, das mit 200 war nur n' Beispiel!
4.Also hab ich probiert und eben verschiedene Ergebnisse erhalten.
4.a) Mit der Version 1: den kompletten String. Aber da muss ich die Größe schon wissen (const).
4.b) Mit der Version 2: dynamische Zuweisung der Größe, hatte ich nur den Text bis zum ersten "\0", also nach dem Beispiel nur "blabla".Nun das macht mich stutzig. Ich hatte geglaubt, dass ich mit beiden Versionen
identische Variablen erzeuge, nur auf unterschiedlichem Weg?!Nochwas: Das mit der Größe 200 war nur ein Beispiel, hab ja extra ne Variable
"iSize" genommen, die mit ner anderen Funktion zur Größenbestimmung den Wert erhält. Ich weiss auch, dass ich dann bei "new" wieder Speicher freigeben muss.
Das mit der Trennung des erhaltenen Strings ist auch kein Problem, erstmal muss ich ihn korrekt erhalten.
-
Wenn du nicht weißt, wie lang das ist, wie willst du es dann feststellen?
-
Ringding schrieb:
Wenn du nicht weißt, wie lang das ist, wie willst du es dann feststellen?
Klar weiss ich das, aber:
wenn ich die Variable cTest anlegen will mit:
char cTest[??]
dann muss ich für ?? einen konstanten Wert eintragen, am besten ne Zahl
und keine Variable. Zur Entwurfszeit weiss ich das aber noch nicht.
Also mach ich das dynamisch mit:char *cTest = new char[??]
da kann ich für ?? ne Variable einsetzen.
Bei diesen Überlegungen und Tests ist mir ja mein Problem aufgefallen, dass
die beiden Versionen der Initialisierung einen Unterschied machen und das verstehe ich nicht. Also den Unterschied der Initialisierung schon aber nicht
das, was und wie die Variablen an Rückgabewerten aufnehmen können , denn die unterscheiden sich in der ganz oben (first posting) genannten Form.