Kann mir jemand erklären, warum mit C++ so komische Zeichen ausgibt?

5 Antworten

Der Grund für die "komischen Zeichen" ist der, dass &meinString[100] die Adresse nach dem Array identifiziert. Dort steht irgendwas, aber nicht das Ergebnis der Ersetzung.

Stattdessen ist entweder "meinString" oder "&meinString[0]" zu verwenden.

hab' mir den Code nochmal genauer angesehen...
neben dem Offensichtlichen, sind da noch einige Fehler drin !!!

such und ersetz sind nur einzelne Chars, cin benötigt aber einen String, kein einzelnes Char !!!

dementsprechend sind auch die Zuweisungen zu pSuch und pErsetz falsch...

 // beides müssen mindestens 2 Chars sein (weil nullterminierte Strings)
 char such[2];
 char ersetz[2];
 char meinString[100];
 char* pSuch;
 char* pErsetz;
 char* pString1;

 cout << "String eingeben: " << endl;
 cin >> meinString;

 cout << "Zeichen erstetzen: " << endl;
 cin >> such;

 cout << "Durch was?: " << endl;
 cin >> ersetz;

 // entweder so (Zeiger auf erstes Char)
 pSuch = &such[0];
 pErsetz = &ersetz[0];
 pString1 = &meinString[0];
 // oder ganz einfach so (weil alle schon Zeiger sind)
 pSuch = such;
 pErsetz = ersetz;
 pString1 = meinString;

 // beides schon Zeiger also kein Asterisk davor
 cout << pSuch << endl;
 cout << pString1 << endl;
xBlackMass 
Fragesteller
 24.09.2018, 15:52

Wie schaffe ich es jetzt mit einer Schleife und nem Pointer die Stelle zu ermitteln, wo ich das ersetzen möchte und es dann auch dementsprechend ersetze?

0
JupStrunk  24.09.2018, 15:59
@xBlackMass

da gibt es verschiedene Ansätze...
ich mach eine neue Antwort dafür, weil man hier in einem Kommentar keine Code-Formatierung machen kann... ;)

1
VeryBestAnswers  24.09.2018, 16:03
@JupStrunk

Doch, Quellcode geht auch in den Kommentaren (klick rechts oben auf "Tt" und dann auf "···")

0
JupStrunk  24.09.2018, 16:05
@VeryBestAnswers

aha, da hast Du mir auch was beigebracht !!! :D

dann hier nochmal die zwei Ansätze zum Ersetzen...

// entweder solange der String nicht zuende ist
for(int i = 0; pString1[i] != '\0'; ++i){
 if(pString1[i] == pSuch[0]) pString1[i] = pErsetz[0];
}

// oder solange i kleiner als die Länge des Strings ist
for(int i = 0; i < strlen(pString1); ++i){
 if(pString1[i] == pSuch[0]) pString1[i] = pErsetz[0];
}
0

hier zwei Ansätze zum Ersetzen...

// entweder solange der String nicht zuende ist
for(int i = 0; pString1[i] != '\0'; ++i){
 if(pString1[i] == pSuch[0]) pString1[i] = pErsetz[0];
}

// oder solange i kleiner als die Länge des Strings ist
for(int i = 0; i < strlen(pString1); ++i){
 if(pString1[i] == pSuch[0]) pString1[i] = pErsetz[0];
}
xBlackMass 
Fragesteller
 24.09.2018, 16:06

Aber wie gebe ich jetzt die neue Zeichenkette aus?

0
JupStrunk  24.09.2018, 16:07
@xBlackMass

wie vorher, ist ja immer noch der selbe String, nur bearbeitet...

0
xBlackMass 
Fragesteller
 24.09.2018, 16:09
@JupStrunk

Ok habs rausgefunden, aber wie kriege ich das mit z.B. einem Satz hin? Bei einzelnen Wörtern geht das, aber bei mehreren nicht

0
JupStrunk  24.09.2018, 16:20
@xBlackMass

cin als solches nimmt nur ein einzelnes Wort an...
um Sätze einzugeben, musst Du cin so benutzen:

cin.getline(meinString, sizeof(meinString));
0
xBlackMass 
Fragesteller
 24.09.2018, 16:34
@JupStrunk

Danke, hab noch das Problem, dass wenn ich ein Zeichen eingebe, also durch was es ersetzt werden soll nur ein Buchstaben angeben kann. z.B. ich würde gerne bei Test das "es" durch ein "x" ersetzen, geht aber nicht ich kann nur einzelne Buchstaben ersetzen. Wie kriege ich das hin?

0
JupStrunk  24.09.2018, 16:39
@xBlackMass

ohhhh...
jetzt wird's kompliziert !!!
dann muss der such String erstmal gößer als 2 dimensioniert werden...
und dann muss in der Suchschleife noch eine Vergleichschleife eingefügt werden...
und schlussendlich müssen dann alle nachfolgenden Chars im String aufgerückt werden...
wobei Du jedesmal prüfen musst, ob der Index nicht über die Stringlänge geht...

da solltest Du lieber auf eine Stringklasse zurückgreifen, die dann Ersetzfunktionen zur Verfügung stellt !!! ;)

0
VeryBestAnswers  24.09.2018, 16:09

Bist du dir sicher, dass das bei Unicode kein Problem ist? Ein Zeichen ist nicht immer genau 1 Byte groß.

Für diesen Zweck gibt es bereits Funktionen in der Standardbibliothek.

0
JupStrunk  24.09.2018, 16:11
@VeryBestAnswers

darum geht's hier wohl nicht...
ist eher eine einfache Aufgabe zur Zeigerarithmetik...

1

pString1 ist schon ein Zeiger, wenn Du jetzt ein Asterisk (*) davor stellst, derefernzierst Du den Zeiger, sollte bei pSuch aber genauso sein !!!
versuche es mal ohne dem Asterisk...

Es kann sein das es keine Sonderzeichen ausgeben kann.