Thomas Mundt <
mundt_...@yahoo.de> writes:
> In einem sehr großer string > 10 Millionen char sollen Wörter ersetzt
> werden.
>
> Das funktioniert auch, nur dauert es verdächtig lange :-(
>
> Hat jemand eine Idee woran es liegen könnte?
>
> Hier der Code:
> -----------------------------------------------------------------------------------------------------
>
> #include <stdio.h>
> #include <string.h>
> #include <stdlib.h>
>
> char string[] = "Sehr_grosser_string_der_<item>und</
> item>sehr_oft_ca_30000_mal_enthaelt";
>
>
> // Copy the string in a new bigger string
> char *new_string;
> new_string = (char*) malloc(50000000 * sizeof(char));
>
> strcpy(new_string,string);
>
> char search[] = "item";
> char replace[1000];
>
> char *tempString;
> char *searchStart;
>
> int error = 0;
> int len = 0;
> int cnt = 1;
>
>
> // Check if substring could be found
> searchStart = strstr(new_string, search);
> if(searchStart != NULL) {
>
> // Allocate memmory
> tempString = (char*) malloc(50000000 * sizeof(char));
>
> if(tempString != NULL) {
>
> // Create a temporary copy of the string
> strcpy(tempString, new_string);
>
> // ersten Abschnitt in String setzen
> len = searchStart - new_string;
> new_string[len] = '\0';
>
> // zweiten Abschnitt anhaengen
> sprintf(replace,"item%d",cnt);
> strcat(new_string, replace);
>
> // dritten Abschnitt anhaengen
> len += strlen(search);
> strcat(new_string, (char*)tempString+len);
Um das auch noch mal ausdruecklich hier zu haben: Diese Form des
Umgangs mit sogenannten 'C strings' ist technisch nicht besonders
sinnvoll weil jedes strcat damit beginnt, den ersten String
zeichenweise zu durchsuchen um die abschliessende Null zu finden.
Nehmen wir mal beispielshalber an, der initiale string sei "A" und an
diesen sollen der Reihe nach die Strings "B", "C" und "D" angefuegt
werden.
1. strcat vergleicht 2 Zeichen und kopiert zwei: "AB"
2. strcat vergleicht 3 Zeichen und kopiert zwei: "ABC"
3. strcat vergleicht 4 Zeichen und kopiert zwei: "ABCD"
Das laeuft darauf hinaus, das fuer 'Suchen des Endes' ingesamt 2 + 3 +
4 Arbeitsschritte benoetigt werden bzw 2 + 3 + 4 + ... + n fuer n
Anfuegungen und das sind ((n * n + n) / 2) - 1 Arbeitsschritte
womit erklaert sein duerfte, warum das fuer lange Strings 'lange'
dauert.
Wiederholtes Ersetzen von Teilstrings in einem String hat sogar wenn
es sinnvoll implementiert ist, dasselbe Problem, weil fuer jede
Ersetzung ein 'Schwanzstring' kopiert werden muss, dh fuer die
Gesamtzahl der Arbeitsschritte bekommt man wiederum die Summe eine
Reihe, lediglich einer absteigenden. Hier waere eine Datenstruktur,
die diesen Vorgang ohne wiederholte String-Kopien ermoeglicht, also zB
eine verkettete Liste von 'Teilstrings' (zehn Zeichen von a, dann fuenf
Zeichen von b, dann fuenfzehn Zeichen von a + n usf) sehr angebracht.