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.


Anmelden zum Antworten