Buchstabe ersetzen



  • Wieso klappt das nicht?

    char* text = "0,00";
    
    while(*text = '\0')
    {
    	if(*text = ',')
    	{
    		*text = '.';
    	}
    	*text++;
    }
    

    mfg A-l-e-x



  • Mehrere Gründe:

    1. = ist Zuweisung, nicht Vergleich - dafür benutzt du ==
    2. Der Inhalt von test ist ein konstanter String, in dem du nicht einfach rum schreiben darfst.
    3. Du willst die Schleife laufen lassen, solange das Zeichen, das du betrachtest, nicht '\0' ist

    Richtig wärs so:

    char test[] = "00,0", *p = test;
    
    while(*p != '\0') {
      if(*p == ',')
        *p = '.';
      ++p;
    }
    

    Oder, noch schöner:

    char test[] = "00,0", *p;
    
    for(p = test; *p != '\0'; ++p)
      if(*p == ',')
        *p = '.';
    


  • A-l-e-x schrieb:

    Wieso klappt das nicht?

    Der Code hat undefiniertes Verhalten. Ein Stringliteral hat in C++ den Typ
    const char* (genaugenommen array von const char), ist also immer read-only, d.h. du darfst ein solches Stringliteral nicht verändern. Zwar gibt es aus Gründen der Abwärtskompatibilität (Kompatibilität zu C) eine Konvertierung von const char* nach char*, dass ändert allerdings nicht an der Tatsache, dass du das Stringliteral nicht verändern darfst. Das war auch schon in C so, auch wenn der Typ nicht darauf hinweist.

    Grundsätzlich solltest du dir angewöhnen Stringliterale immer über const char* anzusprechen.

    In diesem Fall musst du selbst Speicher bereitstellen:

    char text[] = "0,00"; 
    ...
    


  • 🙄 Ups 🙄 Wollte eigentlich auf die Schnelle mein Problem schildern. Ist aber irgendwie in die Hose gegangen (Sau viele Fehler). Also hier müsste der richtige Code sein:

    char* Ersetzen(char* buffer, char eins, char zwei)
    {
    	while(*buffer != '\0')
    	{
    		if(*buffer == eins)
    		{
    			*buffer = zwei;
    		}
    		buffer++;
    	}
    	return buffer;
    }
    
    char text[255] = "0,00";
    SetDlgItemText(...,(LPCTST)Ersetzen((char*)text, ',', '.'));
    

    'Tschuldigung nochmal 🙄

    mfg A-l-e-x



  • hi
    versuchs mal so

    char* Ersetzen(char* buffer, char eins, char zwei)
    {
        char * ret = buffer;
        while(*buffer != '\0')
        {
            if(*buffer == eins)
            {
                *buffer = zwei;
            }
            buffer++;
        }
        return ret;
    }
    

    deine version gibt einen zeiger auf das string-ende zurück
    Kurt



  • Wie soll das funktionieren? Du willst doch prüfen, ob ein Zeichen das von dir angegebene ist, oder? Warum arbeitest du eigentlich mit c-strings? So würde ich es machen:

    #include <string>
    string & Ersetzen(string &buffer, char eins, char zwei) 
    {
        for(int i=0;i<=buffer.size();++i)
            if(buffer[i]==eins)
            buffer[i]=zwei;
        return buffer; 
    } 
    
    char text[255] = "0,00"; 
    SetDlgItemText(...,Ersetzen.c_str()(text, ',', '.'));    //Ist das so richtig? Erst.c_str() und dann die Parameter?
    


  • @ness: natürlich ist deine version eleganter. Ich wollte aber nur zeigen warum die version von A-l-e-x immer einen leeren string zurückgibt.
    K.



  • http://www.c-plusplus.net/forum/viewtopic.php?t=86917
    Funktioniert natürlich auch mit einem char-Array.

    mfg JJ


Anmelden zum Antworten