CString zu Int



  • hustbaer schrieb:

    Ja, ich mach auch immer nen Dialog auf wenn ich nen String in eine Zahl konvertieren möchte... 😕

    ?? ES_NUMBER is doch ein style fuer eine editbox - dh beim erstellen einfach ES_NUMBER dazu schon nimmt die box nur zahlen an, und man braucht nicht mehr ueberpruefen ob wirklich eine zahl eingegeben wurde



  • hustbaer schrieb:

    p.S.: die Funktionen kennen alle kein CString, aber da sie mit const char* bzw. const wchar_t* arbeiten kann man sie genausogut mit CString verwenden.

    Ich stehe vor dem gleichen Problem wie der OP, komme aber keinen Schritt weiter.

    Ich habe ausprobiert:

    CString n = "2004";
    int i = atoi(n.GetBuffer(0));
    

    liefert mir

    Konvertierung des Parameters 1 von 'wchar_t *' in 'const char *' nicht möglich
    1> Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat

    Dann habe ich die 'ATL and MFC String Conversion Macros' gefunden mit dem ich anshceint von CString nach char* konvertieren kann.
    Der folgende Code (anders Beispiel)

    CString PhaseText;	
    m_WndEditPhase.GetWindowTextW(PhaseText);
    LPCSTR pPhaseString = T2A( PhaseText );
    m_Phase = atoi(pPhaseString);
    

    ergibt jedoch den Fehler

    error C2065: '_lpw': nichtdeklarierter Bezeichner
    error C2065: '_convert': nichtdeklarierter Bezeichner
    error C2065: '_acp': nichtdeklarierter Bezeichner

    Jetzt stehe ich mit einem Simplen Problem CString -> int und nicht der geringsten Lösung ziemlich ratlos dar und hoffe auf eine Lösung.

    Matthias



  • In einem andere Forum stand die Lösung (http://www.codeguru.com/forum/archive/index.php/t-256785.html)
    m_Phase = _ttoi(PhaseText);

    allerdings überhaupt nicht selbsterklärend...

    Matthias



  • std::string string = "2004";
    std::ostringstream ss(string);
    int integer = 0;
    ss >> integer;
    

    Das wäre Std.

    Und es liegt daran das du UNICODE definiert/aktiviert hast, dass der dir bei

    CString string = "2004";
    int i = atoi(string);
    

    eine Fehlermeldung bringt.



  • (D)Evil schrieb:

    std::string string = "2004";
    std::ostringstream ss(string);
    int integer = 0;
    ss >> integer;
    

    Das wäre Std.

    viel schönerer Code. Bleibt nur die Frage wie ich aus einem CString einen string mache.

    (D)Evil schrieb:

    Und es liegt daran das du UNICODE definiert/aktiviert hast, dass der dir bei

    CString string = "2004";
    int i = atoi(string);
    

    eine Fehlermeldung bringt.

    Das war mir klar.

    Matthias



  • ? Naja du kannst entweder hingehen und dir einen std::basic_string von TCHAR anlegen um auch da auf Zeichensatz Unabhängigkeit zu setzen oder du nimmst bei UNICODE halt nen std::wstring...

    CString my_c_string("Das ist mein String");
    std::wostringstream ss(my_c_string);
    int integer = 0;
    ss >> integer;
    

    hab jetzt aber nicht nachgeguckt ob stringstream nen string oder nen const (w)char(_t)* haben will, wenn man direkt nen string als Ausgangswert setzt.



  • pospiech schrieb:

    Dann habe ich die 'ATL and MFC String Conversion Macros' gefunden mit dem ich anshceint von CString nach char* konvertieren kann.
    Der folgende Code (anders Beispiel)

    CString PhaseText;	
    m_WndEditPhase.GetWindowTextW(PhaseText);
    LPCSTR pPhaseString = T2A( PhaseText );
    m_Phase = atoi(pPhaseString);
    

    ergibt jedoch den Fehler

    error C2065: '_lpw': nichtdeklarierter Bezeichner
    error C2065: '_convert': nichtdeklarierter Bezeichner
    error C2065: '_acp': nichtdeklarierter Bezeichner

    Jetzt stehe ich mit einem Simplen Problem CString -> int und nicht der geringsten Lösung ziemlich ratlos dar und hoffe auf eine Lösung.

    Matthias

    Hast du dir den MSDN-Eintrag überhaupt durchgelesen? Dort steht doch, daß du für die Makros noch ein 'USES_CONVERSIONS' am Anfang der entsprechenden Funktion benötigst.



  • CStoll schrieb:

    Hast du dir den MSDN-Eintrag überhaupt durchgelesen? Dort steht doch, daß du für die Makros noch ein 'USES_CONVERSIONS' am Anfang der entsprechenden Funktion benötigst.

    Ich habe folgende Seite gelesen:
    http://msdn2.microsoft.com/en-us/library/87zae4a3(VS.80).aspx
    dort taucht 'USES_CONVERSIONS' auf der gesamten Seite nicht auf. Ich weiß daher nicht was du genau meinst.

    Matthias



  • Putz dir doch mal bitte die Brille und schau genauer hin:

    When using an ATL string conversion macro, specify the USES_CONVERSION macro at the beginning of your function in order to avoid compiler errors. For example:

    void func( LPSTR lpsz )
    {
       USES_CONVERSION;
       ...
       LPWSTR x = A2W(lpsz)
       // Do something with x
       ...
    }
    

    (das steht gaanz unten auf der Seite ;))



  • Ups - ich hatte es zum Suchen in Firefox angegeben und der hat mir keine gesagt das es nicht vorhanden wäre. Jetzt findet er es... Trotzdem Danke.

    Matthias



  • (D)Evil schrieb:

    std::string string = "2004";
    std::ostringstream ss(string);
    int integer = 0;
    ss >> integer;
    

    Ich habe das gerade mal getestet, bekomme aber die Fehlermeldung

    no match for ‘operator>>’ in ‘ss >&

    das würde bedeuten, dass gerade die Umwandlung nicht implementiert ist.
    Verwirrt...

    Matthias


Anmelden zum Antworten