Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » ?????? buffer[] ??????

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
26.04.2004, 15:02 Uhr
~Theo_aus_Lodz
Gast


Ich schreibe gerade an einer Fkt., welche einen String durch einen anderen ersetzen soll. Hatte diese auch schon soweit fertig. Allerding liess sie nur einen Durchlauf zu. Ich möchte noch eine Schleife einbauen, damit wirklich alle Strings ersetzt werden und nicht nur der erste.
Das war mein Code bisher: FFFAAAALLLSSSSCCCCHHHH!!!!!


C++:
char* ersetzen(const char* re, const char* repl, const char* in, char* buffer) {


    char *pdest;
    pdest= strstr(in,re);
    char* ptr;

    
    while(pdest)
    {

        if (!re || !repl || !in || !buffer) return buffer=NULL;
        ptr=strstr(in, re);
        if(!ptr)  {
            strcpy(buffer, in);
            return buffer;
        }
    
        *buffer=0;
        if ((ptr!=in) && (pdest)){  
        
            strncpy(buffer, in, ptr-in);
            buffer[ptr-in]=0; // damit ich strcat benuzten kann
        }
        strcat(buffer, repl);
    
        ptr+=strlen(re);
        strcat(buffer, ptr);

        pdest = 1+(strstr(in,re));
        
    }
    return buffer;
    
    
}


Das funzt aber nicht. Ich habe auch schon Vorschriften, wie ich es umsetzen kann, leider komme ich aber damit nicht klar... Kann mir jemand helfen?
Hier die Anweisungen anhand eines billigen Bsp:

Code:

Text = "hallihallo"
Suchstring = "ll"
Ersetzstring = "pp"
Buffer = ""

1. Suchstring wird an Position 3 (Index 2) gefunden
2. (Schleifenbeginn) Alles vor dem Suchstring in Text wird nach Buffer kopiert -> Buffer = "ha"
3. Danach kommt Ersetzstring hinzu -> Buffer = "happ"
4. Die Position wird um die Länge von Suchstring erhöht -> Pos = 5
5. Die Position wird in alter Position gemerkt
6. Der Suchstring wird nun ab Position gesucht und an Position 8 in Text gefunden
7. Alles zwischen alter Position und Position wird an Buffer drangehängt -> Buffer = "happiha"
8. siehe 3. -> Buffer = "happihapp"
9. siehe 4. -> Pos = 10
10. siehe 5.
11. Wieder wird gesucht nach dem Suchstring, diesmal wird er aber nicht gefunden (Schleifenende)
12. Der Rest von Text wird an Buffer angehängt -> Buffer = "happihappo"


So, jetzt muss ich das für meine Fkt. umsetzen. Wie gehts? Bitte um Hilfe!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.04.2004, 15:04 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


es hilft nicht wenn man für die gleiche frage 100 mal einen anderen thread aufmacht.
wies geht steht hier
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.04.2004, 15:12 Uhr
~Theo_aus_Lodz
Gast


Ja, aber der Code ist ja wiederum nur für einen Schleifendurchlauf. Und um dort noch eine vernünftige Schleife hinzubauen, muss ich sicherlich einiges an der Funktion ändern... Es geht ja lediglich darum, dass nicht nur 1 Suchstring ersetzt wird, sondern alle. Kann mir jemand diesen Code umschreiben??? (evtl. mit Kommentare, damit auch ich das verstehe..)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
26.04.2004, 15:25 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


so wie ichs gepostet habe ersetzt der alle und liefert als ergebnis die anzahl der ersetzungen zurück, also eigentlich genau das was du laut deiner beschreibung haben wolltest
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
26.04.2004, 15:34 Uhr
~Theo_aus_Lodz
Gast


Gut, habe jetzt den Code von dir genommen.
Dieser ersetzt so fünf Strings und stürzt dann ab, woran kann das denn noch liegen??
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
26.04.2004, 15:42 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


zeig mal wie du es verwendet hast
ich habs wie gesagt nicht getestet sondern einfach nur ins forum gehackt
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 26.04.2004 um 15:43 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
26.04.2004, 15:51 Uhr
~Theo_aus_Lodz
Gast


Naja, wie du halt gepostet hast...

C++:
int ersetzen(char *such, char *neu, char *inp){
int flag,rv=0;
char *p,*q,*r,*tmp;
    tmp=new char[strlen(inp)+1];
    for(p=inp;*p;++p){
        flag=1;    
        for(q=such,r=p;*q&&*r&&flag;++q,++r)if(*q-*r)flag=0;
    
        if(flag){
            for(q=tmp;*r;++q,++r)*q=*r;
            *q='\0';
            for(q=neu,r=p;*q;++q,++r)*r=*q;
            for(q=tmp;*q;++r,++q)*r=*q;
            *r='\0';
            ++rv;
        }        
    }

    delete [] tmp;

    return rv;
}



Und so rufe ich diese Funktion auf:


C++:
ersetzen("1234", "abc", inp);

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
26.04.2004, 15:53 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


naja ich wollte nicht meine funktion nochmal sehen sondern das wie du es aufrufst...

wie sieht dein inp aus?
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 26.04.2004 um 15:53 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
26.04.2004, 16:03 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ums mal für dich leichter verständlich und selber wartbar zu machen kommentier ich das mal

C++:
int ersetzen(char *such, char *neu, char *inp){
int flag,rv=0;  //rv beinhaltet wieviele ersetzungen gemacht wurden
char *p,*q,*r,*tmp;
    tmp=new char[strlen(inp)+1]; //buffer zum umkopieren allokieren
    for(p=inp;*p;++p){  //für jedes zeichen des inputs
        flag=1;    
        for(q=such,r=p;*q&&*r&&flag;++q,++r)if(*q-*r)flag=0;  //checkt ob such ab der stelle wo p gerade steht im string ist
wenn ja ist flag nach dem schleifendurchlauf auf 1 sonst 0
    
        if(flag){ //wenn zu ersetzender text gefunden
            for(q=tmp;*r;++q,++r)*q=*r; //kopiere das was nicht überschrieben werden solll in den buffer
            *q='\0';
            for(q=neu,r=p;*q;++q,++r)*r=*q; //schreibe das neue wort an die aktuelle stelle
            for(q=tmp;*q;++r,++q)*r=*q; //kopiere das im buffer gesicherte zurück hinter die ersetzte stelle
            *r='\0';
            ++rv;
        }        
    }

    delete [] tmp; //buffer wieder freigeben

    return rv;
}



--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
26.04.2004, 16:22 Uhr
~Theo_aus_Lodz
Gast


Mein inp ist ein ganz normaler, einzeiliger String, welcher durch | getrennt ist.
Und mit diesem inp muss ich anschließend weiter arbeiten.
Bsp. für mein inp: 'abcd|dsaf|das|darf|...'
Und da werden dann z.B. alle 'da' durch meinetwegen '123' ersetzt...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: