kurze Frage - const char* in string umwandeln



  • Hallo..

    wie wandele ich const char* in einen string um ????

    Danke



  • const char *text = "Hallo, Welt\n";
    std::string my_string = text;
    

    Am besten so 😉



  • Ich muss irendwie von "string Name" zu "char Name []" kommen !

    Hat jemand ne Idee?



  • Hi!

    Was nun? char * zu string oder string zu char [] ???

    std::string str( "hallo welt" );
    char *blub = str.c_str();
    

    so in etwa??

    grüße



  • Hmm also machen wirs konkret:

    ich habe 2 strings die meiner Funktion übergeben werden. Es geht darum 2 strings zu vergleichen, mit der Schwierigkeit den String nur bis zu einem bestimmten Token zu vergleichen... Hier die Funktionen:

    bool Controller::stringCompare (string sPath, string sSource) {
    
    int iResult =0;
    char* tPath;
    char* tSource;
    
    char* cPath = sPath.c_str();       // <------------------
    char* cSource = sSource.c_str();  // <------------------
    
    tPath = token (cPath);
    tSource = token (cSource);
    
    iResult = strcmp (tPath, tSource);
    
    }
    
    char* Controller::token(char* string) {
    
    char* Vergl = NULL;
    char Seperator [] = "_";
    
    Vergl = strtok (string, Seperator);
    return Vergl;
    }
    

    Und er sagt mir jetz an diesen Stellen (wo der Pfeil ist), dass

    Initialisierung: const char* kann nicht in char* konvertiert werden. Durch die Konvertierung gehen Qualifizierer verloren.

    Ne Idee?



  • kurze Frage schrieb:

    Ne Idee?

    Kopieren (schlecht), selber ne Tokenize-Funktion basteln (nicht gut) oder den Vorschlag aus dem anderen Thread - boost - aufgreifen (toll).



  • hi

    dsPath.c_str() liefert einen Zeiger auf einen constanten C string, darum muss auch der aufnehmende Zeiger constant sein.

    versuchs also mal mit:
    const char* cPath = sPath.c_str();
    const char* cSource = sSource.c_str();

    Grüße

    😉



  • kurze Frage schrieb:

    ich habe 2 strings die meiner Funktion übergeben werden. Es geht darum 2 strings zu vergleichen, mit der Schwierigkeit den String nur bis zu einem bestimmten Token zu vergleichen...

    Das lässt sich doch auch mit 'Hausmitteln' erledigen. Hier ein Vorschlag:

    #include <algorithm>
    #include <iostream>
    #include <iterator>
    #include <string>
    
    using namespace std;
    bool stringCompare( const string& sPath, const string& sSource ) 
    {
        const char Seperator = '_';
        string::const_iterator bis1 = find( sPath.begin(), sPath.end(), Seperator );
        string::const_iterator bis2 = find( sSource.begin(), sSource.end(), Seperator );
        if( distance( sPath.begin(), bis1 ) != distance( sSource.begin(), bis2 ) )
            return false; // strings sind nicht gleich lang, also nicht gleich
        return equal( sPath.begin(), bis1, sSource.begin() );
    }
    
    int main()
    {
        string path = "Ein Text_Rest";
        string source = "Ein Text_ was ganz anderes";
        if( stringCompare( path, source ) )
            cout << path << " == " << source << endl;
        string source2 = "Ein Text";
        if( stringCompare( path, source2 ) )
            cout << path << " == " << source2 << endl;
        string source3 = "Ein text";
        if( !stringCompare( path, source3 ) )
            cout << path << " != " << source3 << endl;
        return 0;
    }
    

    Übrigens greift Controller::stringCompare anscheinend auf keine Member von Controller zu. Wenn dem so ist, so sollte das auch keine Methode der Klasse Controller sein.

    Gruß
    Werner



  • @ muro:

    habe ich alles schon probiert. Problem ist, dass strtok nur mit char* kann und nicht mit const char*. Also bräuchte ich was, was meine strings in char* umwandelt!!!



  • wenn du UNBEDINGT strtok verwenden willst (in C++ ist Werners Ansatz womöglich die bessere Alternative), schau dir mal die string::copy() an.

    (btw, strings haben es nicht gerne, wenn unkontrolliert in ihren Daten rumgeschrieben wird - und die char*-Funktionen schreiben unkontrolliert)



  • Also ich finde, manchmal ist es vertretbar selbst etwas zu basteln:

    #include <iostream>
    #include <string>
    using namespace std;
    
    //Tipp: Die folgende Funktion kann für mehr als nur strings verwendet werden.
    template<typename TContainer, typename TToken>
    bool isEqualBeforeToken(const TContainer &a, const TContainer &b, const TToken &token)
    {
        typename TContainer::const_iterator iterA, iterB;
        for(iterA = a.begin(), iterB = b.begin();
            iterA != a.end() && iterB != b.end() && (*iterA) != token && (*iterB) != token;
            ++iterA, ++iterB)
            if((*iterA) != (*iterB))
                return false;
        return true;
    }
    
    int main()
    {
        string foo = "Hallo Welt";
        string bar = "Hallo Erde";
        cout << isEqualBeforeToken(foo, bar, 'E') << endl;
        cin.get();
    }
    


  • ich habs gelöst...
    es ist garnicht so kompliziert. Dadurch, dass ich ja mit Name.c_str() in const char* umwandeln kann, setze ich einfach beim Aufruf

    token ((char*)cSource);

    Und das klappt..
    Vielen Dank für die vielen Vorschläge!



  • Dir ist doch hoffentlich klar, daß du damit die verglichenen Strings zerlegst? Das kann gut gehen, aber spätestens wenn du dort einen echten const string übergibst, hast du ein Problem (und selbst wenn nicht: nach dem Vergleich kannst du die verglichenen Strings vermutlich nicht mehr weiterverwenden).



  • Für den Vergleich ist nur eine Iteration nötig. Du machst aber gleich 3! 2x mit strtok und 1x mit strcmp.


Anmelden zum Antworten