CString zu Int



  • Hey Leute,
    wie kann man einen CString der logischerweise nur zahlen enthält, zu einem int konvertieren...

    mfg



  • Die einfachste Version wäre atoi, bloss kannst du da leider Fehlerfälle nicht am Rückgabewert erkennen. Dann gäbe es noch strtol, std::stringstream und sscanf.
    Wenn du Unicode verwendest kannst du _tcstol/wcstol, std::wstringstream bzw. _stscanf/swscanf nehmen.

    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.



  • JanDMC schrieb:

    ... einen CString der logischerweise nur zahlen enthält...

    logischerweise ?



  • Danke, mit .atoi() gehts gut....

    ... logischerweise meine ich, wenn ich "hallo welt" zu int konvertieren will is nich sooo logisch.. also ich wollte damit sagen das es voraussetzzung ist das der string nur zahlen enthält( wird vorher geprüft)..

    vielen dank..

    mfg



  • heisser tip:

    ES_NUMBER



  • Mr Evil schrieb:

    heisser tip:

    ES_NUMBER

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



  • hustbaer schrieb:

    Mr Evil schrieb:

    heisser tip:

    ES_NUMBER

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

    Es gibt aber genug, die den CString eingeben lassen und DANN umwandeln wollen.



  • 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