Adresse eines Strings in char-Zeiger
-
Aloha,
ich habe in meinem Project ein assoziatives Array angelegt. Es besteht aus zwei Stringwerten (map<string, string>) Nun benötige ich in einer anderen Funktion einen char-Pointer auf eine Stelle des Arrays um so Werte des Arrays verändern zu können.
Vielleicht noch ein kleines Beispiel was ich möchte:map<string,string> mymap; void change(char *target) { /* Funktionen die Variable auf die target zeigt verändern */ } int main (int argc, char **argv) { mymap["Stelle 1"] = "erste Stelle"; mymap["Stelle 2"] = "zweite Stelle"; mymap["Stelle 3"] = "dritte Stelle"; /*Aufruf der Funktion, beispielsweise auf myapp["Stelle 2"]*/ change(...); }Wie wandle ich nun eine Stelle in eine char-Pointer um bzw übergebe diese Stelle richtig?
mfg chuqa
-
Hallo,
warum übergibst du nicht einfach den gespeicherten String als Referenz?map<string,string> mymap; void change(std::string& target) { } int main (int argc, char **argv) { mymap["Stelle 1"] = "erste Stelle"; mymap["Stelle 2"] = "zweite Stelle"; mymap["Stelle 3"] = "dritte Stelle"; change(myapp["Stelle 2"]); }
-
Weil in der Zielfunktion andere, fremde Funktionen aufgerufen werden, die diesen Wert als char-Pointer erwarten.
mfg chuqa
-
Chuqa schrieb:
Weil in der Zielfunktion andere, fremde Funktionen aufgerufen werden, die diesen Wert als char-Pointer erwarten.
Dann hilft dir nur ein "copy-modify-replace"-Ansatz, da dir std::string keine Möglichkeit gibt direkt in seinen Innereien rumzupuhlen.
-
Verändert diese fremde Funktion deinen String?
Wenn nicht, übergib ihr ein const char* über target.c_str().
Wenn doch, mußt du wohl einen temporären char* erzeugen, deinen String dort reinkopieren und nachher alles in Target zurückschreiben.char* tstr = new char[target.size()+1]; strncpy(tstr,target.c_str(),target.size()); fremdeFunktion(tstr); target = tstr; delete[] tstr;
-
Ist es erlaubt, über die Adresse des ersten Elements an einen nicht-const-Zeiger zu kommen und darüber den String zu modifizieren? Ich vermute, nicht.
-
@Braunstein
Falls die Funktion zwar den Inhalt, nicht aber die Länge des Strings verändert, würde ich die Kopie in einem std::vector unterbringen und mir somit das Memory-Management ersparen:void change(std::string& target) { std::vector<char> temp(target.begin(), target.end()); temp.push_back(0); fremdeFunktion(&temp[0]); target.assign(temp.begin(), temp.end()); }
-
MFK schrieb:
Ist es erlaubt, über die Adresse des ersten Elements an einen nicht-const-Zeiger zu kommen und darüber den String zu modifizieren? Ich vermute, nicht.
Nope. Die einzige Möglichkeit legal an einen char* zu kommen wäre &deinString[0]. Da nun aber nicht garantiert ist, dass ein std::string als nullterminiertes Array von char implementiert ist, ist der Zeiger nicht unbedingt äquivalent zu "Anfang der Zeichenkette".
-
Ich habe es mit der Methode von Braunstein gemacht und es wird zumindestens ohne Fehler kompiliert.
Ich danke euch ersteinmal recht herzlich.
mfg chuqa.