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' istRichtig 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 sochar* 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