CString auslesen
-
unsigned int parseMs(char const* str) { unsigned int result; if(std::sscanf(str, "+ %dms 0", &result) != 1) throw std::logic_error("parseMs : Invalid string"); return result; }
C-Style. Effizienter, schöner, kürzer und sogar mit Fehlerbehandlung.
Edit: Upps, Frage eher überflogen ...
-
Ethon, dir ist schon klar, dass der String ein Beispiel war?
Edit: Post nur überflogen...
-
Na Hacker, wiedermal zuviel Redbull oder sowas getrunken?
-
theta schrieb:
Na Hacker, wiedermal zuviel Redbull oder sowas getrunken?
Zählt auch Zuckerwasser?
-
Sone schrieb:
Es geht auch deutlich einfacher:
std::string str("asdf12.5ms"); size_t found_pos = str.find("ms"), first_num = str.find_last_not_of("123456789.", found_pos - 1) + 1; std::string numba = str.substr(first_num, found_pos - first_num);
da bekomm ich eine Fehlermeldung:
2 IntelliSense: "class "ATL::CStringT<wchar_t, StrTraitMFC_DLL<wchar_t, ATL::ChTraitsCRT<wchar_t>>>"" hat keinen Member ""Find_last_not_of"".und substr ist leider auch keine Member von CString
-
Diese Variante :
CString str("+ 1200ms 0"); size_t g = str.Find(_T("ms")); if (g != std::string::npos) { CString millis; while (--g >= 0 && str[g] >= '0' && str[g] <= '9') { millis += str[g] + millis; } m_textbox1.SetWindowTextW(millis); }
führt in der Textbox zu folgendem Ergebnis:
000200010002000
-
Irgendwie ist das doch ein Problem: Der Threadsteller hat offensichtlich nicht so die Ahnung was er macht - ist aber kein Problem. Wäre es nicht, wenn ihm bei seinem Problem geholfen würde. Wird aber nicht.
Die feinen Helfer haben leider keine Ahnung was CString ist und schieben einfach ihre Lösung mit std::string hin - was dem Threadsteller nicht direkt hilft, aber gut. Und nebenbei: Dass die Helfer keine Ahnung von CString haben ist auch kein Problem (es fehlt halt die Erfahrung), aber ev. sollten sie sich dann nicht vordrängen mit "helfen".
Das Resultat ist im letzten Post vom Threadsteller zu sehen: CString, gemischt mit std::string Zeugs (z.B. std::string::npos, welches ev. zufällig gerade noch funktioniert).
Schaut mal ihr nur-std::Kenner, es gibt nicht nur std:: und auch wenn std:: meistens eine gute Lösung ist, bzw. bietet, ist es nicht alles was einem im Programmieralltag begegnet std:: - und ich zumindest würde, wenn ich mich im MFC (oder ATL, ja, da gibts auch CString) Umfeld aufhalte, nicht zu std::string greifen - und zwar, oh Wunder, weil es einfach keinen Sinn ergibt.
-
Ich bin mir sicher sie haben es nur gut gemeint. Aber eine Lösung hab ich immer noch nicht, wobei die Variante von JohnSilver zumindest etwas ausgibt.
Dass ich nicht so recht weiß, was ich mache ist auch richtig, sonst wäre ich nicht hier
Hast du vielleicht die Lösung für mein Problem? Wäre sehr dankbar
-
Vielleicht hättest du genug Kopf um zu kapieren, dass ich in meinem Beispiel einen
std::string
nutze und du den Typ nicht einfach ändern kannst. DeinenCString
zustd::string
zu konvertieren geht nicht?Sollte das nicht gehen?
CString cstr = _T("+ 1200ms 0"); std::string str(cstr); size_t found_pos = str.find("ms"), first_num = str.find_last_not_of("123456789.", found_pos - 1) + 1; std::string numba = str.substr(first_num, found_pos - first_num); m_textbox1.SetWindowTextW(numba.c_str());
-
theta schrieb:
Irgendwie ist das doch ein Problem: Der Threadsteller hat offensichtlich nicht so die Ahnung was er macht - ist aber kein Problem. Wäre es nicht, wenn ihm bei seinem Problem geholfen würde. Wird aber nicht.
Die feinen Helfer haben leider keine Ahnung was CString ist und schieben einfach ihre Lösung mit std::string hin - was dem Threadsteller nicht direkt hilft, aber gut. Und nebenbei: Dass die Helfer keine Ahnung von CString haben ist auch kein Problem (es fehlt halt die Erfahrung), aber ev. sollten sie sich dann nicht vordrängen mit "helfen".
Das Resultat ist im letzten Post vom Threadsteller zu sehen: CString, gemischt mit std::string Zeugs (z.B. std::string::npos, welches ev. zufällig gerade noch funktioniert).
Schaut mal ihr nur-std::Kenner, es gibt nicht nur std:: und auch wenn std:: meistens eine gute Lösung ist, bzw. bietet, ist es nicht alles was einem im Programmieralltag begegnet std:: - und ich zumindest würde, wenn ich mich im MFC (oder ATL, ja, da gibts auch CString) Umfeld aufhalte, nicht zu std::string greifen - und zwar, oh Wunder, weil es einfach keinen Sinn ergibt.
Das habe ich höflich ignoriert, da CString meinem C++ Compiler unbekannt ist. Für diverse Frameworks gibt es ja Subforen.
Würde mich aber stark wundern, wenn man aus einem CString keinen std::string machen könnte.
-
das kommt bei: std::string str(cstr);
3 IntelliSense: Keine Instanz des Konstruktors ""std::basic_string<_Elem, _Traits, _Ax>::basic_string [mit _Elem=char, _Traits=std::char_traits<char>, _Ax=std::allocator<char>]"" stimmt mit der Argumentliste überein.
bei dem Versuch den std::string in die Textbox zu implementieren kommt:
4 IntelliSense: Das Argument vom Typ ""const char *"" ist mit dem Parameter vom Typ ""LPCTSTR"" inkompatibel.
Der ganze Quellcode den ich bis habe nutzt CString, deswegen muss es iwie mit CString weitergehen...
-
Aehm, du hast wohl versehentlich den += Operator benutzt,
mach aus
millis += str[g] + millis;
das hier:
millis = str[g] + millis;
Was du gemacht hast, ist jedesmal eine Kopie des aktuellen Strings neu einzufuegen, daher ergibt sich auch die seltsame Zahl:
0
000
0002000usw.
Ansonsten musst du nur
npos
mit einer CString-Loesung (!= -1 wie in deinem urspruenglichem Post?) ersetzen.
-
Sone schrieb:
Vielleicht hättest du genug Kopf um zu kapieren...
An wen ist denn dieser Satz gerichtet?
Sone schrieb:
Deinen CString zu std::string zu konvertieren geht nicht?
Klar geht das. Die Frage ist aber 1. wie einfach geht das? und 2. macht das Sinn? Nein. Es macht keinen Sinn.
Ethon schrieb:
Das habe ich höflich ignoriert, da CString meinem C++ Compiler unbekannt ist.
Tu das. Ist ok.
Ethon schrieb:
Für diverse Frameworks gibt es ja Subforen.
Ja. Dann ist der Threadsteller wohl im falschen Forum. Über den Tellerrand gucken geht wohl nicht. Oder einen Hinweis geben, welches Forum ev. besser geeignet ist?
Ethon schrieb:
Würde mich aber stark wundern, wenn man aus einem CString keinen std::string machen könnte.
Es geht - sogar wieder zurück. Und, würdest Du das machen? Ich nicht, warum auch.
-
{ CString str("+ 1200ms 0"); size_t g = str.Find(_T("ms")); if (g != -1) { CString millis; while (--g >= 0 && str[g] >= '0' && str[g] <= '9') { millis = str[g] + millis; } m_textbox1.SetWindowTextW(millis); }
funktioniert, vielen herzlichen Dank!
wenn ich noch Kommazahlen zu berücksichtigen hätte, wäre doch meine Schleife:
while (--g >= 0 && str[g] >= '0' && str[g] <= '9' && str[g] = '.')
Richtig?
-
Stutzpeter schrieb:
wenn ich noch Kommazahlen zu berücksichtigen hätte, wäre doch meine Schleife:
while (--g >= 0 && str[g] >= '0' && str[g] <= '9' && str[g] = '.')
Richtig?
Nein, denn dann heisst es:
Solange g groesser als 0 ist und das Zeichen zwischen 0 und 9 ist UND ein Punkt ist ....
Das Zeichen kann aber nicht eine Ziffer und gleichzeitig ein Punkt sein, richtig ist:
Solange g groesser als 0 ist und das Zeichen zwischen 0 und 9 ist ODER g groesser als 0 ist UND ein Punkt hat ...
Ausserdem: Benutze noch einen
bool
- Flag, um zu pruefen, ob es das Komma in der Zahl schon gegeben hatNoch ein kleiner Fehler: Du hast den Zuweisungsoperator (=) anstelle des Gleichheitoperators (==) verwendet.
So muesste es eigentlich gehen:
CString str("+ 1200ms 0"); int g = str.find("ms"); if (g != -1) { bool komma = false; CString millis; while (--g >= 0 && ((str[g] >= '0' && str[g] <= '9') || str[g] == '.')) { if ((str[g] == '.' && !komma) || str[g] != '.') millis = str[g] + millis; else komma = true; } if (millis[0] == '.') millis = '0' + millis; m_textbox1.SetWindowTextW(str); }
-
theta schrieb:
Sone schrieb:
Vielleicht hättest du genug Kopf um zu kapieren...
An wen ist denn dieser Satz gerichtet?
Würde mich wundern, wenn du nicht siehst, an wen ich mich im folgenden Satz beziehe.
-
Aehm, das von oben ist Murks, sorry, hatte mich beeilt. So sollte es jetzt aber richtig sein:
CString str("+ 1200ms 0"); int g = str.find("ms"); if (g != -1) { bool komma = false; // komma schon gesetzt? CString millis; while (--g >= 0 && ((str[g] >= '0' && str[g] <= '9') || str[g] == '.')) { // wenn das Zeichen ein punkt ist, ... if (str[g] == '.') { // wenn der Punkt noch nicht gesetzt wurde, setze unser Flag if (!komma) { komma = true; } // ansonsten brechen wir die Schleife ab (Ende der Zahl) else { break; } } millis = str[g] + millis; } // wenn eine zahl vorhanden ist (!= "") und mit einem Punkt beginnt, // dann fuegen wir noch eine 0 davor if (millis != "" && millis[0] == '.') millis = '0' + millis; m_textbox1.SetWindowTextW(str); }
-
Ich kann nur Danke sagen! Wahnsinn! Danke für die Hilfe
-
@theta
ACK
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum MFC (Visual C++) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.