CString auslesen



  • 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
    0002000

    usw.

    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 hat

    Noch 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.



  • Ethon schrieb:

    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.

    Wozu antwortest Du in einem MFC-Forum, wenn CString Deinem Compiler (und auch Dir) unbekannt ist?


Anmelden zum Antworten