CString in Substrings aufteilen



  • hi,

    ich möchte folgendes machen:

    CString strCurrentBackroundcolor = "255, 255, 255";
    
    	strCurrentBackroundcolor.Format("%2d, %2d, %2d", strR, strG, strB);
             // hier ist mein problem :( ich möchte den String strCurrentBackroundcolor in 3 weitere Strings aufteilen, um Sie mit einem int
      // unten einzufügen. Wie teile ich den String immer in 3 Teile ??
      // denn mit strCurrentBackroundcolor.Format("%2d, %2d, %2d", strR, strG, strB); funktioniert es nicht
    
    	int iR =atoi(strR);
    	int iG =atoi(strG);
    	int iB =atoi(strB);
    
    	int r = iR;
    	int g = iG;
    	int b = iB;
    
    	SetDialogBkColor(RGB(r, g, b));
    

    asmodia



  • Hallo,

    es funktioniert so ähnlich wie hier:

    CString minuten = str.Left(2);    //  2 Minuten 
    CString sekunden = str.Mid(3,2);  // 30 Sekunden
    CString zehntel = str.Right(1);   //  1 (1/10) 
    
    // Ergebnis in (1/10) Sekunden
    j = ((((atoi(minuten) * 60) + atoi(sekunden)) * 10) + atoi(zehntel));
    

    Oder du benutzt den String Tokenizer.

    MfG



  • gute frage?!?

    eigentlich ist der String immer so aufgebaut:

    255, 255, 255

    oder

    0, 150, 0

    oder

    110, 250, 180

    wird bei deinem Beipsiel nur die Stellen berücksichtigt, oder auch die Kommas?

    asmodia



  • Aloha,

    auf die schnelle würde ich ohne groß zu denken bei identischen Trennzeichen ( in Deinem Falle das Komma ).

    int n;
    
    CString strR = strCurrentBackroundcolor.Left(n = strCurrentBackroundcolor.Find(','));
    CString strG = strCurrentBackroundcolor.Mid(n+1,strCurrentBackroundcolor.GetLength() - strCurrentBackroundcolor.Find(',',n+1)-1);
    CString strB = strCurrentBackroundcolor.Right(strCurrentBackroundcolor.GetLength()-strCurrentBackroundcolor.ReverseFind(',')-1);
    

    Dann nur noch in Deine ints casten und fertisch ( Ungetestet, sollte aber passen )

    Grüße

    BOA



  • danke, das sieht gut aus.

    ich werde es gleich mal testen.

    asmodia



  • Hallo,

    ich würde es so lösen:

    //color
    CString strrgb="255,255,255";
    //value
    int istelle=0;
    //r
    istelle=strrgb.Find(",");
    int r=atoi(strrgb.Left(istelle));
    strrgb.Delete(1,istelle+1);
    //g
    istelle=strrgb.Find(",");
    int g=atoi(strrgb.Left(istelle));
    strrgb.Delete(1,istelle+1);
    //b
    int b=atoi(strrgb.Left(istelle));
    

    nicht gerade vielleicht sehr schnell aber naja .....nicht getestet

    hoffe konnte helfen
    weisnichtweiter



  • hi,

    ihr seit alle voll net 🙂

    So sieht jetzt mein Beispiel dank BOA aus

    CString strCurrentBackroundcolor = "255, 255, 255";
    
    	int n; 
    
    	CString strR = strCurrentBackroundcolor.Left(n = strCurrentBackroundcolor.Find(',')); 
    	CString strG = strCurrentBackroundcolor.Mid(n+1,strCurrentBackroundcolor.GetLength() - strCurrentBackroundcolor.Find(',',n+1)-1); 
    	CString strB = strCurrentBackroundcolor.Right(strCurrentBackroundcolor.GetLength()-strCurrentBackroundcolor.ReverseFind(',')-1); 
    
    	int iR =atoi(strR);
    	int iG =atoi(strG);
    	int iB =atoi(strB);
    
    	int r = iR;
    	int g = iG;
    	int b = iB;
    
    	CString Color = strR+","+strG+","+strB;
    
    	AfxMessageBox(Color); // nur zur Darstellung
    
    	SetDialogBkColor(RGB(r, g, b));
    

    Es funktioniert beim CString strCurrentBackroundcolor = "255, 255, 255";

    in der MessageBox erscheint 255, 255, 255

    Nun kann der String auch so aussehen

    CString strCurrentBackroundcolor = "99, 16, 255";

    und dann steht in der MessageBox 99, 16,, 255

    Was dann natürlich nicht mehr funktioniert..

    Weist du Boa wo der Fehler ist?

    asmodia



  • Hi weisnichtweiter,

    ich habe deinen Code jetzt auch versucht. Gefällt mir auch recht gut, nur besteht da das selbe Problem wenn der String so aufgebaut ist

    CString strCurrentBackroundcolor = "99, 16, 255";

    Hast du oder irgendwer anderes da eine Idee??

    asmodia



  • Aloha,

    jetzt hab ich mal getestet.

    Tausch mal die mittlere aus

    CString strG = strCurrentBackroundcolor.Mid(n+1,strCurrentBackroundcolor.Find(',',n+1)-(n+1));
    

    Sollte funzen..

    Grüße

    BOA



  • funzt 😃 😃 😃

    Vielen vielen Dank BOA und allen anderen 👍

    asmodia



  • Aloha,

    so richtig Hackerscheiße ist alles in einer Zeile...

    int r = atoi(strCurrentBackroundcolor.Left(n = strCurrentBackroundcolor.Find(',')));
    int g = atoi(strCurrentBackroundcolor.Mid(n+1,strCurrentBackroundcolor.Find(',',n+1)-(n+1)));
    int b = atoi(strCurrentBackroundcolor.Right(strCurrentBackroundcolor.GetLength()-strCurrentBackroundcolor.ReverseFind(',')-1));
    

    Unübersichtlich hoch zehn... 😉

    Grüße

    BOA



  • Hallo,

    und meins auch nochmal korrigiert auch wenns ein wenig
    länger ist 🙄 :

    CString strstring="99,16,255";
    int n;
    CString strR=strstring.Left(n=strstring.Find(","));
    UpdateData(FALSE);
    strstring.Delete(0,n+1);
    UpdateData(FALSE);
    CString strG=strstring.Left(n=strstring.Find(","));
    strstring.Delete(0,n+1);
    UpdateData(FALSE);
    CString strB=strstring;
    MessageBox(strR+","+strG+","+strB);
    

    bis denn
    weisnichtweiter


Anmelden zum Antworten