string::c_str Rückgabewert
-
Ich überlege zzt eine meienr Klassen von char Arrays auf strings umzustellen. Dabei stellt sich mir eine Frage zum Rückgabewert von c_str(). Laut Dokumentation bekomtm man ja einen char* auf die Zeichenkette inkl \0. Was aber wird da eigentlich geliefert wenn der String leer ist? gibt es da nur ein \0 oder einen NULL-Zeiger?
Hintergrund meiner Frage ist die Abfrage die ich zzt benutze, hier einmal ein Schema der Klasse.
class myclass { private: char* charkette;//Zeiger für die Zeichenkette public: myclass(const char* pkette=NULL) { //hier new für charkette und kopieren etc }; char* getkette() { if(charkette!=NULL) return charkette; else return "standardantwort" }; };Die Klasse nimmt einen Zeiger auf ein Chararray, und kopiert es in ein eigenes, außer es ist NULL, beid er Abfrage wird dann der Inhalt ausgegeben ode rim Falle von NULL ein Standardtext.
Mit arrays geht das halt wudnerbar nur mit strings komme ich an der Stelle nicht ganz weiter.
-
Dabei stellt sich mir eine Frage zum Rückgabewert von c_str(). Laut Dokumentation bekomtm man ja einen char* auf die Zeichenkette inkl \0. Was aber wird da eigentlich geliefert wenn der String leer ist? gibt es da nur ein \0 oder einen NULL-Zeiger?
1. es ist ein const char*
2. wann soll denn ein NULL-Zeiger zurückgegeben werden können? dort steht, dass der zugehörige const c-string zurückgegeben wird - also NIEMALS etwas anderes - bei einer leeren zeichen kette also "" und das ist ja nichts anderes, als '\0'das hätte man aber auch einfach mal ausprobieren können

und wieso hast du ne eigene string-klasse geschrieben, die wahrscheinlich sehr viel langsamer und fehleranfälliger etc ist?!
bb
-
unskilled schrieb:
1. es ist ein const char*
Ich weis, das tut dem Ergebniss aber keinen Abbruch ob es Konst is oder nicht, wichtig is ja was unterm Strich rauskommt.
unskilled schrieb:
2. wann soll denn ein NULL-Zeiger zurückgegeben werden können? dort steht, dass der zugehörige const c-string zurückgegeben wird - also NIEMALS etwas anderes - bei einer leeren zeichen kette also "" und das ist ja nichts anderes, als '\0'
Naja ind er Dokumentation steht eine Zeichenkette mit Abschluß \0 was aber passiert wenn die Kette leer ist Stand da nicht, von daher lieber gefragt als hinterher Fehler drin.
unskilled schrieb:
und wieso hast du ne eigene string-klasse geschrieben, die wahrscheinlich sehr viel langsamer und fehleranfälliger etc ist?!
Weil es keine string Klasse ist, das ist nur ein Teil einer Klasse die etwas total anderes macht, es geht mir nur um das abwägen ob ich solche Daten in den Klassen als string oder als Char array speichere.
-
Xebov schrieb:
unskilled schrieb:
1. es ist ein const char*
Ich weis, das tut dem Ergebniss aber keinen Abbruch ob es Konst is oder nicht, wichtig is ja was unterm Strich rauskommt.
Doch - es ist was anderes - was vollkommen anderes... Also wenn du oft non-const char* pointer brauchst (z.bsp. bei der winapi passiert das ja relativ oft), kann man mit std::string nicht so viel anfangen...
char *x = new char[123]; strcpy (x, "asdasdasdad"); /*geht*/ std::string y; y.reserve(123); strcpy (y.c_str(), x); // /*geht nicht*/ delete []x;Xebov schrieb:
unskilled schrieb:
und wieso hast du ne eigene string-klasse geschrieben, die wahrscheinlich sehr viel langsamer und fehleranfälliger etc ist?!
Weil es keine string Klasse ist, das ist nur ein Teil einer Klasse die etwas total anderes macht, es geht mir nur um das abwägen ob ich solche Daten in den Klassen als string oder als Char array speichere.
Jemand hier im Forum hat mal die Beschreibung einer Klasse (recht treffend) beschrieben: wenn man die aufaben der klasse beschreibt und auch nur einmal "und" verwenden muss, sollte man die Klasse noch mal aufteilen...
Falls du noch immer zwischen char* und std::string abwägst: In ca. 99% der Fälle ist std::string die bessere Wahl - ist nicht nur komfortabler sondern wahrscheinlich auch sehr viel schneller, als du es mit char* implementieren könntest ^^
Aber du könntest auch einfach mal erklären, wozu du die (c-)strings brauchst - dann könnte man das 1% wahrscheinlich auch noch ausschließen ^^bb
-
unskilled schrieb:
Doch - es ist was anderes - was vollkommen anderes... Also wenn du oft non-const char* pointer brauchst (z.bsp. bei der winapi passiert das ja relativ oft), kann man mit std::string nicht so viel anfangen...
OK ich hab mich etwas falsch ausgedrückt, für das was ich meine ist es erstmal egal ob const oder nicht, den Unterschied kenn ich ja.
unskilled schrieb:
Aber du könntest auch einfach mal erklären, wozu du die (c-)strings brauchst - dann könnte man das 1% wahrscheinlich auch noch ausschließen ^^
Dateinamen für einige WINAPI Funktionen speichern, bzw Dateinamen in Klassen speichern um dann auf die dateien zuzugriefen, oder wie im Beispiel oben eine Exception Klasse die ne Meldung abliefern soll. Die Kettenw erden im Grudne nur ins Array kopiert und das wars mehr stellen die Klassen damit garnicht an, im Grudne ne Handelsübliche Variable.
Und da ich gerade allen Klassen in meinem Projekt eine generalüberholung mit Exceptions usw spendiere ist halt die Frage String oder nicht String.
Allerdings ist das halt nicht so toll:unskilled schrieb:
Doch - es ist was anderes - was vollkommen anderes... Also wenn du oft non-const char* pointer brauchst (z.bsp. bei der winapi passiert das ja relativ oft), kann man mit std::string nicht so viel anfangen...
Aber meine eigentliche Frage ist soweit geklärt.
-
Um Kompatibilität zu C-Schnittstellen zu gewährleisten, ist eventuell auch
std::vector<char>eine Wahl. Da musst du dich zwar selber um die Nullterminierung kümmern, aber mit&vec[0]kannst du auf den internen Speicher lesend und schreibend zugreifen. Du solltest einfach sicherstellen, dass genügend Elemente Platz haben...
-
Nexus schrieb:
Um Kompatibilität zu C-Schnittstellen zu gewährleisten, ist eventuell auch
std::vector<char>eine Wahl. Da musst du dich zwar selber um die Nullterminierung kümmern, aber mit&vec[0]kannst du auf den internen Speicher lesend und schreibend zugreifen. Du solltest einfach sicherstellen, dass genügend Elemente Platz haben...ist nicht
std::stringgenau eine solche ableitung vonstd::vector<char>?
-
daersc schrieb:
ist nicht
std::stringgenau eine solche ableitung vonstd::vector<char>?Nein,
std::stringist ein Typedef aufstd::basic_string<char>. Im Gegensatz zustd::vectorwird beistd::stringnicht garantiert, dass der Speicher intern linear verwaltet wird.