Entwickler-Ecke

C# - Die Sprache - Meine replace Funktion


Implementer - Mi 28.11.07 19:38
Titel: Meine replace Funktion
Hi alle!

Ich versuche die replace Version nachzubauen, komme aber leider zu keinem positiven Ergebnis. Ich hoffe das mir vielleicht in diesem Forum jemand helfen kann.

Warum nehm ich nicht einfach die String.replace Funktion? Nunja, ich interessiere mich nunmal dafür wie "vorgefertigte" Funktionen funktionieren und versuche sie nachzubauen
:-).

Mit ref out hab ich nicht gearbeitet da ja nichtmal in der Funktion der Wert verändert wird.

Ich habe nach dem gleichen Prinzip eine replace Funktion für chars geschrieben und diese funktioniert. Komisch ?

Vielen Dank für jede Hilfe

Hier mein Code:

Bsp:


C#-Quelltext
1:
2:
string text = "Guten Tag";
replaceStr(text,"Tag","Abend"); //



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
public static void replaceStr(string word, string word2, string replace) 

            int i; 
            int x = 0, y, z, l; 
            char[] place = new char[word.Length]; 
            for (i = 0; i < word.Length; i++) 
            { 
                place[x] = word[i]; // place wird mit word gefüllt 
                x++; 
             } 

            for (y = 0, z = 0, l = 0; y < place.Length && z < word2.Length && l < replace.Length; y++, z++, l++) 
            { 
                Console.WriteLine(y); // Hier werden NUR die ersten 3 Elemente angezeigt statt 9 Warum?
                
                if (place[y] == word2[z]) // Da nur die ersten 3 Elemente existieren funzt auch der Vergleich nicht 
                { 

                    place[y] = replace[l]; 
                    y++; 
                    l++; 
                    z++; 

                    
                } 

            } 
            Console.WriteLine(place); // place bleibt unverändert 

}


Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


Christian S. - Do 29.11.07 01:07

Du erhöhst in jedem Schleifendurchlauf z und die Schleife bricht ab, wenn z den Wert word2.Length erreicht hat und das ist 3.

Könntest Du evtl. erklären, wie Deine Schleife funktionieren soll? Ich blick da nicht so ganz durch :gruebel:


golgol - Do 29.11.07 09:50

Die Schleife ist mir derzeit auch nicht ganz klar. Davon abgesehen müsstest du aber Probleme bekommen, wenn das Originalwort länger als das zu ersetzende Wort ist, da du die Array-Länge fest mit der Länge des Original-Strings dimensionierst. In deinem Beispiel hätte der String voher 9 und nachher 11 Buchstaben, das Array ist aber nur 9 Buchstaben lang => IndexOutOfRangeException


JüTho - Do 29.11.07 10:45

user profile icongolgol hat folgendes geschrieben:
... Davon abgesehen müsstest du aber Probleme bekommen, wenn das Originalwort länger als das zu ersetzende Wort ist, da du die Array-Länge fest mit der Länge des Original-Strings dimensionierst...

Und deshalb gleich noch den nächsten allgemeingültigen Hinweis: Wenn Strings "verändert" werden sollen, vor allem mehrfach (z.B. in einer Schleife), dann ist unbedingt der StringBuilder zu verwenden. Strings sind unter C# sowieso unveränderlich; Änderungen führen deshalb zu ständigem Hin und Her im Arbeitsspeicher. Jürgen


Implementer - Do 29.11.07 16:21

Vielen Dank für eure Antworten!

Ich habe eine andere Funktion geschrieben die alle chars in einem Wort ersetzen soll und diese funzt nach dem gleichen Prinzip und geht :gruebel:

Zitat:
Könntest Du evtl. erklären, wie Deine Schleife funktionieren soll?


Die erste for schleife:
Zuerst wird das Array place mit dem Inhalt von string word gefüllt

Die zweite for schleife:

y,z,l sollen alle chars durchlaufen.
y soll alle chars von place durchlaufen, z alle chars von word2 usw..


C#-Quelltext
1:
 for (y = 0, z = 0, l = 0; y < place.Length && z < word2.Length && l < replace.Length; y++, z++, l++)                    


Werden im place Array chars von word2 gefunden if (place[y] == word2[z]) sollen die place[y] chars durch die replace[l] chars ersetzt werden.

C#-Quelltext
1:
  place[y] = replace[l];                    



Aber du hast recht viell liegts an z, da z ab dem 3 Element abgebrochen wird.