Problem bei Stringbearbeitung (war: bin ich bloed)
-
ich hab en irgendwie sehr ominoeses problem
wenn ich den unten angegebenen quell code ausfuehre, wird erscheint nachdem ich button1 geklickt hab in meine caption "hallo+du+olle" ... warum is das so?die funktion FixStr tut doch nix an dem uebergebenen wert aendern sie gibt lediglich einen String zurueck in dem alle leerzeichen durch ein pluszeichen ersetzt werden
....
irgendwie is das komisch .. ich hab ja noch nich mal ein pointer uebergeben
String MUH="hallo du olle"; //--------------------------------------------------------------------------- String FixStr(String Text) { String Tmp=Text; for(int i=0;i<Tmp.Length();i++) if(Tmp.c_str()[i]==' ') Tmp.c_str()[i]='+'; return Tmp; } void __fastcall TForm1::Button1Click(TObject *Sender) { FixStr(MUH); Caption=MUH; } //---------------------------------------------------------------------------
warum ist das so?
danke
Edit:
Bitte aussagekräftige Überschriften wählen. Danke![ Dieser Beitrag wurde am 25.02.2003 um 10:27 Uhr von Jansen editiert. ]
-
String Tmp=Text;
Du weist der Variablen Tmp hier in der Tat lediglich die Referenz auf Text zu.
Also Operationen auf Tmp wirken direkt auch auf Text.
Um es kurz zu machen: Tmp UND Text zeigen beide auf das gleiche Ansistring-Objekt.MfG
T.R.
-
Das liegt an der internen Speicherverwaltung von AnsiString bzw. String. Wenn Du Tmp den String Text zuweist, erhalten beide Strings quasi den selben Speicherbereich, sprich Text. Mach nach der Zuweisung von Tmp=Text; ein Tmp.Unique(); um beide Strings "zu trennen"
-
String FixStr(String Text) { for(int i=0;i<Text.Length();i++) if(Text.c_str()[i]==' ') Text.c_str()[i]='+'; return Text; }
selbst wenn ich die funktion so schreibe sollte ja an dem uebergebenen wert nix geaendert werden ..
dazu muesste man so doch so schreiben
void FixStr(String *Text)
{
for(int i=0;i<Text.Length();i++)
if(Text.c_str()[i]==' ')
Text.c_str()[i]='+';
}[/cpp]
-
das mit dem Tmp.Unique(); hat funktioniert ... aber irgendwie komisch denn ich hate in meiner ganzen c++ zeit noch nie ein solsches problem
-
Das sind halt die "Eigenheiten" der AnsiString Klasse. Wenn man die kennt, ist alles kein Problem mehr.
Immer dran denken, AnsiString ist kein Datentyp sondern eine Klasse
-
ist nicht eine klasse auch ein datentyp ?
-
Hallo,
Bloss mal als kleinen Hinweis. Man sollte dem Pointer den die Funktion c_str() liefert möglichst nichts zuweisen, da dieser Pointer unbestimmt werden kann (siehe Borland Hilfe). Das ist hier auch nicht nötig.
Denn das hier funktioniert auch.String FixStr(String Text) { for(int i=1;i<=Text.Length();i++) if(Text[i]==' ') Text[i]='+'; return Text; }
Oder noch einfacher
String FixStr(String Text) { Text = StringReplace(Text," ","+",TReplaceFlags() << rfReplaceAll); }
Ciao
[ Dieser Beitrag wurde am 25.02.2003 um 11:28 Uhr von Braunstein editiert. ]