2016-10-24 7 views
1

Ich arbeite derzeit mit MFC, um ein bestimmtes Programm zu erstellen, das den Benutzer erfordert, eine Reihe von Zahlen wie unten in einer CString (nennen wir es aCString der Einfachheit halber) zu markieren.Konvertieren eines CString in ein Array von Floats

enter image description here

kann ich einen String oder Array von Zeichen zu einem Array von Schwimmern mit 'strtok' problemlos konvertieren.

Aber ich habe Mühe, CString in eine Zeichenfolge oder ein Array von Zeichen zu konvertieren, damit ich die oben erwähnte Umwandlung tun kann!

-I versucht strcpy

strcpy(my_string, (LPCTSTR)aCString); 

Aber bekam diesen Fehler

char * strcpy (char *, const char *) ': Konvertierung Argument 2 von 'LPCTSTR' auf' const char * '

Ich schätze die Hilfe!

+1

das Äquivalent zu 'strtok()' (wenn auch nicht destruktiv) ist [CString :: tokenize()] (https: // Msdn Die Token können dann auf Gleitkommawerte die std::stof Funktion umgewandelt werden. microsoft.com/en-us/library/k4ftfkd2.aspx). –

+0

Aufgrund der Internationalisierung verwendet 'CString' keine normalen' char' als Zeichen, sondern 'TCHAR', die abhängig vom Makro 'UNICODE' in den Projekteinstellungen als' char' oder 'wchar_t' definiert werden. –

Antwort

4

Die CString Klassenvorlage enthält das Tokenize Member, mit dem eine Eingabezeichenfolge in einzelne Tokens aufgeteilt werden kann.

std::vector<float> ToFloats(const CString& numbers) { 
    std::vector<float> buffer; 
    int start{ 0 }; 
    CString token = numbers.Tokenize(_T(","), start); 
    while (start != -1) { 
     buffer.push_back(std::stof({ token.GetString(), 
             static_cast<size_t>(token.GetLength()) })); 
     token = numbers.Tokenize(_T(","), start); 
    } 
    return buffer; 
} 
+0

Nicht vergessen Ausnahme Behandlung für 'std :: stof' –

+0

@BarmakShemirani: Es ist seltsam, dass Sie' std :: stof' herausgreifen. 'std :: vector :: push_back' kann werfen, und auch' CStringT :: Tokenize'. Aber das ist alles außer dem Punkt: Der geeignete Weg, Ausnahmen in dieser Funktion zu behandeln, ist, überhaupt nichts zu tun. Diese Funktion kann nicht wissen, ob ein Fehler beim Konvertieren der Eingabe oder beim Konstruieren der Ausgabe tolerierbar oder fatal ist. Es ist der Aufrufer, der Ausnahmen behandeln muss, weil nur der Aufrufer weiß. – IInspectable

+0

@BarmakShiemrani: Diese Funktion verspricht, einen Vektor von Schwimmern zurückzugeben. Wenn es dieses Versprechen nicht erfüllen kann, löst es eine Ausnahme aus. Jeder Aufrufer in der Aufrufkette kann entscheiden, ob Ausnahmen sinnvoll behandelt werden können. Diese Funktion kann nicht. Außerdem "stürzen" nicht abgefangene Ausnahmen * nicht ab. Sie rufen den 'unexpected' Handler auf, der standardmäßig' terminate' aufruft. Das ist eine saubere und deterministische Abschaltung. – IInspectable

Verwandte Themen