PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++/MFC] ein zeichen aus einem CString ersetzen


Blocki
2007-05-20, 16:30:50
moin moin,
ich versuche schon die ganze zeit verzweifelt folgendes:

-es wird ein wort eingegeben - beispiel: None (wort ist ein CString)
-es wird fuer jeden buchstaben je ein "_ " in ein eingabefeld geschrieben

bis dahin ok...

nun will ich:
-es wird ein button gedrueckt und es soll N_n_ im eingabefeld erscheinen.

tja. ich bin zu bloed um mit Replace(); umzugehen.

kann mir einer helfen?

Matrix316
2007-05-20, 17:16:03
EDIT:http://www.uni-muenster.de/ZIV/Mitarbeiter/ReinhardMersch/C++BasisKurs6.html

CString s1;

s1.replace(i,j,s2) ersetzt den Teil von s1, der beim Index i beginnt und j Zeichen lang ist, durch s2.

Blocki
2007-05-20, 17:26:54
hmmm...

CString wort, geheim;

wort="None";
geheim="_ _ _ _";

und geheim gibt er mit in einem eingabefeld schon aus.

nun soll durch druecken auf den button "N", alle "N"s und "n"s erscheinen.
also nach klicken des buttons "N":

"N_n_";

wenn ich dann den button "O" druecke, soll dann "Non_" rauskommen. also im grunde soll das ganze das spiel hangman werden.

Matrix316
2007-05-20, 17:52:16
Oder so:

char *wort ="None";
char *geheim = "____";

Schleife mit int i über Anzahl der Buchstaben in wort:
wenn an Position i in Wort Buchstabe ... ist (wort[i]), dann soll in geheim, an der gleichen Position (geheim[i]) _ durch Buchstabe ersetzt werden.

EDIT: Kannst auch mit [] auf einen CString zugreifen! http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/vccore/html/_core_strings.3a_.basic_cstring_operations.asp

Blocki
2007-05-20, 18:15:01
EDIT:http://www.uni-muenster.de/ZIV/Mitarbeiter/ReinhardMersch/C++BasisKurs6.html

CString s1;

s1.replace(i,j,s2) ersetzt den Teil von s1, der beim Index i beginnt und j Zeichen lang ist, durch s2.
wenn ich das so mache, wie du es da geschrieben hast, bekomm ich das hier:
"D:\meine programme\hangman\MehrHaupt.cpp(176) : error C2661: 'Replace' : Keine ueberladene Funktion akzeptiert 3 Parameter."

CString buchstabek="n";

wort.Replace(1,1,buchstabek);


kannst du mir zu deinem 2. vorschlag vielleicht mal ne beispielschleife bauen? ich peil grad nix ;(.

Matrix316
2007-05-20, 18:27:28
Eingabe: char eingvariable='N'


for(int i=0; i< wort.length; i++) //halt wie du die Länge von wort bekommst
{
if(wort[i]==eingvariable)
geheim[i] = eingvariable;
}

Blocki
2007-05-20, 18:36:23
hmmm...

problem liegt darin, dass er bei


char *word=wort;
char *geheimn=geheim2;



D:\meine programme\hangman\MehrHaupt.cpp(168) : error C2440: 'initializing' : 'class CString' kann nicht in 'char *' konvertiert werden

und

D:\meine programme\hangman\MehrHaupt.cpp(169) : error C2440: 'initializing' : 'class CString' kann nicht in 'char *' konvertiert werden


auswirft...

und

geheimn[pos] = buchstabeg;


wirft

D:\meine programme\hangman\MehrHaupt.cpp(175) : error C2679: Binaerer Operator '=' : Kein Operator definiert, der einen rechtsseitigen Operator vom Typ 'class CString' akzeptiert (oder keine geeignete Konvertierung moeglich)


aus.

wohlgemerkt ist das eine MFC-Anwendung... sollte es zumindest werden.

Spearhead
2007-05-20, 20:02:47
Gibt's nen bestimmten Grund das du unter C++ dafür CString benutzt statt string?

Gast
2007-05-20, 20:20:38
Gibt's nen bestimmten Grund das du unter C++ dafür CString benutzt statt string?

Steht im Titel: MFC

Spearhead
2007-05-20, 21:58:47
gut, bei MFC kenn ich mich nicht aus.

Aber man könnte ja für bearbeitungen den CString in nen string umwandeln und dann sich dann wieder nen CString über var.c_str() zurückgeben lassen.

Das ganze klingt nach ner eher kleinen Anwendung da dürfte das auf die Performance keinen großen Einfluß haben ;)

Macht natürlich nur Sinn wenn der TS das bearbeiten der Strings darüber dann besser hinkriegt. Das oben genannte replace gibt es bei string z.b.:
http://www.cppreference.com/cppstring/replace.html

ShadowXX
2007-05-20, 22:11:53
hmmm...

problem liegt darin, dass er bei


char *word=wort;
char *geheimn=geheim2;


Nicht char und CString mischen. Wenn du nur CStrings benutzt funktioniert seine routine.

Also:
Eingabe:

CString eingvariable='N';
CString Wort = "None" , Geheim = "____";

for(int i=0; i < Wort.GetLength(); i++) //halt wie du die Länge von wort bekommst
{
if(Wort[i] == eingvariable)
Geheim[i] = eingvariable;
}

Blocki
2007-05-20, 22:37:28
der sagt mir bei


Geheim[i] = eingvariable;



D:\meine programme\hangman\MehrHaupt.cpp(174) : error C2440: '=' : 'class CString' kann nicht in 'char' konvertiert werden

Matrix316
2007-05-21, 09:55:04
Dann versuch mal die "EingVariable" auch als CString zu definieren.

Ectoplasma
2007-05-21, 10:46:48
CString word = "None", confidential = "____";
char typedIn = 'N';


for (int i = 0; i < word.GetLength() && i < confidential.GetLength(); ++i) {
if (tolower(word[i]) == tolower(typedIn)) {
confidential.SetAt(i, word[i]);
}
}


Das langt wohl denke ich. Sicherheitshalber erfolgt die Längenprüfung noch auf beiden Strings.