string zu CString



  • Hi ihrs ich hab nen winzig kleines problem.

    Ich möchte daten aus einer string variablen in eine CString variable übertragen.
    dazu verwende ich folgende codezeile

    strPlate=string1.c_str();
    

    nun habe ich das problem, dass wenn ich

    cout << string1;
    

    mache richtig MD180 ausgegeben wird (Kennzeichen)
    wenn ich nach dieser Operation

    cout << strPlate;
    

    mache kommt
    00359958 heraus (oder anderer kauderwelsch)

    woran kann das liegen?


  • Mod

    Weil er CString nicht einfach als LPCSTR interpretiert.
    Wenn Du VS200x verwendest kannst Du

    cout << strPlate.GetString();
    

    verwenden.
    Ansonsten

    cout << static_cast<LPCTSTR>(strPlate);
    


  • Danke für die schnelle Antwort habe allerdings nach wie vor selbige Ausgabe 🙂

    btw. verwende visual studio 2005



  • probier das mal:

    CString strPlate;
    strPlate.Format(_T("%s"), string1.c_str());
    cout << strPlate;
    

    ich vermute das die zuweisung fehl schlaegt - evtl mal debuggen und variablen ueberwachen



  • Und ich vermute, daß du in einer UNICODE-Umgebung compilierst - sprich: verwende einfach 'wcout' als Ziel für die Ausgabe.

    PS: Wieso ist es eigentlich nötig, den std::string in einen CString umzuwandeln? str::ostream kommt doch mit ersterem viel besser zurecht.



  • weil die funktion an die ich das kennzeichen übergeben soll eine cstring verlangt 🙂



  • Und die Ausgabe findet in dieser Funktion statt?

    (die Antwort "xyz benötigt das so" ist noch lange kein Grund, die Bedingungen von xyz im gesamten Programm durchzusetzen)



  • naja ich wills auch nicht im ganzen programm durchsetzen 🙂 die ausgabe in sachen cout war auch nur ne prüfung ob ich auch das richtige zeug in den variablen drinne hab 🙂

    naja auf jedenfall nach neustart von visual studio läufts jetzt da hatte sich wohl irgendwas aufgehangen

    danke für die hilfe



  • AtlanVIII schrieb:

    die ausgabe in sachen cout war auch nur ne prüfung ob ich auch das richtige zeug in den variablen drinne hab

    solche sachen macht man eher im gebugger im watch bereich - oder du schaust in den ram (Debug -> Windows -> Memory -> Memory 😵 und dort die variable rein ziehen wie im watch modus, das ist das zuverlaessigste, da siehst du immer hundert prozent was in der variablen steht und wie groß es ist usw

    meist reicht aber das watch (oder auto)



  • jo hast schon recht aber ursprünglich war das was ich da programmieren sollte als halb stunden sache gedacht 🙂 da wollt ich nicht so viel wind machen 🙂
    hat dann endgültig doch etwas länger gedauert 🙂 nächstes mal mach ichs wieder ohne faulheit dann wirds wieder besser 🙂



  • moin,
    mein problem ist ganz ähnlich..

    zur ausgabe in meiner listbox benötige ich ein cstring zum aufruf einer funktion das ganze als char[].. ich werd noch beklopt..

    nun muss ich die "textfelder" auch noch zerstückeln und vergleichen...
    mit den string hab ich mal den befehl substr gesehen.. geht der bei csting auch?

    ich denke es ist das beste wenn ich da mit der klasse std::str also string mach..
    wie wandel ich denn einen cstring in einen string um?



  • individuum schrieb:

    ...
    nun muss ich die "textfelder" auch noch zerstückeln und vergleichen...
    mit den string hab ich mal den befehl substr gesehen.. geht der bei csting auch?
    ...

    schau dir
    str.Mid(...)
    und
    str.Find(...)
    sowie
    str.ReverseFind(...) an

    (str ist CString)



  • werd ich machen.. danke erstmal..



  • Neues Problem..

    Ich habe eine instanz der klasse list..

    in meiner instanz befinden sich structs..

    struct Cache
    	{
    		string meldung;
    		string tagnummer;
    		Cache (string meldung_) : meldung(meldung_),tagnummer(meldung_.substr(0,2)) {}			
    	};
    	typedef list <struct Cache> cache;
    	cache mycache;
    

    nun möchte ich das element löschen wenn die tagnummer schon vorhanden ist...
    dazu hab ich den befehl
    mycache.remove_if gefunden.. mir ist nun aber nicht klar wie ich da die tagnummer die sich ja in der structur und in der list befindet abfragen kann..

    string neu;
    //die ersten beiden sind die tagnummer
    mycache.remove_if(neu.substr(0,2).compare(hier der string aus dem struct))

    hat jemand ne idee wie ich da dann rankomm?



  • Abgesehen davon, daß deine Namenswahl katastrophal ist - an die Elemente der Struct kommst du über . (bei Zeigern über ->). Aber remove-if() erwartet sowieso eine Funktion, mit der es jedes Element testen kann, also ist es wohl am besten, so eine Funktion (bzw. Funktor) bereitzustellen.



  • sorry, wie sollte ich denn mein namenswahl gestalten?
    hab nicht anders gelernt bislang...

    leider versteh ich nicht ganz was du meinst...
    also soll remove-if ein funktion aufrufen wo jedes elmement durchlafen wird?!
    meinst du vielleicht so?

    remove_if(Fktsearch(neu.substr(0,2));
    
    bool Fktsreach(string vergleich)
    {
        for(it = mycache.begin();it!=mycache.end();it++)
        {
            if(it->meldung.compare(vergleich));
               retrun true;
        }
        retrun false;
    }
    


  • individuum schrieb:

    sorry, wie sollte ich denn mein namenswahl gestalten?
    hab nicht anders gelernt bislang...

    Vor allem solltest du die Namen so wählen, daß sie sich nicht nur nach Groß- und Kleinschreibung unterscheiden (also entweder cache und cache_list oder cache_element und cache, aber die Variante Cache und cache ist einfach nur verwirrend)

    also soll remove-if ein funktion aufrufen wo jedes elmement durchlafen wird?!

    remove_if erwartet eine Funktion (oder etwas funktionsartiges), die ihm sagen kann, ob ein bestimmtes Listenelement gelöscht werden soll. Die ruft es dann für jedes Element der Liste auf. Du benötigst also so etwas:

    bool has_tag(const Cache& data, const string& tag)
    { return data.tagnummer==tag; }
    
    ...
    mycache.remove_if(bind2nd(has_tag,neu.substr(0,2)));
    //bind2nd ist eine Hilfsfunktion der STL, mit der der zweite Parameter der Funktion festgesetzt wird
    

    (PS: Bei der bind2nd-Syntax bin ich mir nicht ganz sicher)



  • also erstmal vielen dank für deine hilfe!

    CStoll schrieb:

    remove_if erwartet eine Funktion (oder etwas funktionsartiges), die ihm sagen kann, ob ein bestimmtes Listenelement gelöscht werden soll. Die ruft es dann für jedes Element der Liste auf.

    ok, also wenn die von remove_if aufgerufene Funktion true zurückgibt, wird das element gelöscht?!

    das bind2nd benötige ich damit immer die aktuelle struktur übergeben wird? in dem beispiel das "const Cache& data"

    wenn ich das so umsetzte wie du es gemacht hast kommt folgender fehler:
    Fehler 6 error C3867: "CEmpfaengerDlg::Fkthas_tag": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&CEmpfaengerDlg::Fkthas_tag", um einen Zeiger auf den Member zu erstellen.

    das ihm die argumentenliste fehlt ist für mich nachvollziehbar..
    aber wie übergeb ich ihm die?



  • bind2nd bekommt eine zweiwertige Funktion/Funktor und einen konstanten Wert und macht daraus einen einwertigen Funktor, der die übergebene Funktion mit dem aktuellen Parameter und dem an bind2nd übergebenen Wert aufruft - das dient dazu, für die Funktion has_tag() den zweiten Parameter festzulegen (als ersten Parameter übergibt remove_if() nacheinander alle Listen-Elemente). Aber das geht direkt nur mit globalen Funktionen (und eventuell statischen Klassenmembern).

    Wenn du die Vergleichsfunktion als normalen Member der Cache-Klasse definiert hast, brauchst du einen weiteren STL-Funktor namens mem_fun():

    bool Cache::has_tag(const string& the_tag)
    { return this->tagnummer == the_tag; }
    
    ...
    mychache.remove_if(bind2nd(mem_fun(&Cache::has_tag),neu.substr(0,2)));
    //mem_fun wandelt f(x,y) um in x.f(y)
    //bind2nd wandelt f(x) um in f(x,wert)
    


  • Overload!
    Viel zu hoch für mcih 😞

    Cache war doch bislang ein "struct" und keine klasse..
    das zu ändern hab ich versucht, aber bei den fehlern schnell wiede rrückgänig gemacht.

    Ich bin auch überzeugt das es da ne einfachere lösung gibt...

    ich bekomm einen string (45 zeichen lang)
    wenn an stelle 42 ein + steht wird er der list hinzugefüht
    wenn eine # da steht, wird der text, falls vorhanden gelöscht!

    ich dachte remove_if wäre da die schöne lösung.. aber das artet ja extrem aus..

    fällt da jemanden ein anderer lösungweg ein?


Anmelden zum Antworten