problem mit zeiger



  • Hi,
    ich versuche ne funktion zu bauen, wo man in nem string nach nem substring suchen kann, und diesen dann erstezen kann.
    Also sowas wie str_replace() in PHP...

    char str_replace(char *mainstring, char *search, char *replace)
    {
    
    	char *output;
    	char *token;
    
    	token = strtok(mainstring, search);
    	strcat(output, token);
    
    	while(token = strtok(0,search))
    	{
    		strcat(output, replace);
    		strcat(output, token);
    	}
    
    	return *output;
    
    }
    

    Wenn ich die funktion dann aufrufe, stürzt das programm ab...
    Irgendwie bau ich müll mit den zeigern, kann mir jemand sagen was genau ich ändern muss?

    thx



  • Meinst Du nicht das Du für output irgendwie speicher brauchst ?

    P.s.: Wirf mal nen blick auf std::String



  • Auf den ersten Blick sah ich gerade das du als Rückgabewert nur einen char hast, du brauchst jedoch einen char-zeiger, ausserdem muss dann der return wert geändert werden.

    char *str_replace(char *mainstring, char *search, char *replace)
    {
        // ...
        return output;
    }
    

    Aber das ganze geht doch viel einfacher mittels strings und den funktionen find und replace!



  • @Wolle:
    ich hab das jetzt so geändert wies du gesagt hast, aber es stürzt trotzdem ab.

    char *str_replace(char *mainstring, char *search, char *replace)
    {
    
    char *output = new char[100];
    char *token;
    
    token = strtok(mainstring, search);
    strcat(output, token);
    
    while(token = strtok(0,search))
    {
    strcat(output, replace);
    strcat(output, token);
    }
    
    return output;
    
    }
    

    speicher für output hab ich jetzt ja reserviert...mach ich da irgendwie was grundlegendes falsch?

    Wieso ich das nich mit string mache? Ich versuche auf das vordefinierte zeugs zu verzichten, damit ich was lern.



  • Hmm Fehlermeldungen oder ähnliches wären sehr hilfreich.



  • Bevor in 'output' nichts steht, kannst du mittels strcat auch nichts an 'output'
    ranhaengen. Beim ersten Mal benoetigst du ein strcpy oder aehnliches.

    BTW: Schau dir mal die Funktion 'strstr' an, mit der solltest du besser bedient
    sein.

    mfg
    v R



  • Also ich habe mir das ganze noch einmal angeschaut und muss dir sagen das deine ganze Funktion ziemlich unüberlegt ist und nicht das tut was sie soll.

    // ...
    char str[] = "Das ist ein Test.";
    char sea[] = "ist";
    char rep[] = "war";
    char *p;
    
    p = str_replace(str, sea, rep);
    // ...
    
    char *str_replace(char *mainstring, char *search, char *replace)
    {
        char *output = new char[100];
        char *token;
        token = strtok(mainstring, search);  // token zeigt auf folgende Stelle:
                                             //          V 
                                             //   Das ist ein Test.
    
        strcat(output, token);               // ACHTUNG, hier muss output eine null
                                             // terminierte Zeichenkette sein!!!
                                             // Wenn output null terminiert wäre,
                                             // würde folgendes in output stehen:
                                             // " ein Test."
    
        while(token = strtok(0,search))      // Hier findet er nichts mehr in
                                             // mainstring und überspringt hiermit
                                             // die Schleife
        {
            strcat(output, replace);
            strcat(output, token);
        }
        return output;                       // Es würde " ein Test." zurückgegeben
    }
    

    Du solltest dir erst einmal im Kopf klar machen wie genau das Programm ablaufen soll und erst dann anfangen zu programmieren und wenn es für den Kopf zu viel wird auf Papier und Bleistift zurückgreifen.



  • Achja,
    was mir gerade noch aufgefallen ist:

    char *str_replace(char *str, char *search, char *replace)
    {
        char output = new char[100];
        // ...
        return output;
    }
    

    Kein schöner Code, da du Speicher allozierst ihn aber nicht wieder freigibst, du könntest natürlich nach jedem Funktionsaufruf den Speicher wieder freigeben:

    char *p = str_replace(str1, str2, str3);
    // Verwende p;
    delete[] p;
    

    Besser wäre es einen char array als Zeiger zu übergeben in den dann das Ergebnis geschrieben wird und welcher nicht mit delete gelöscht werden muss.



  • // ...
    char str[] = "Das ist ein Test.";
    char sea[] = "ist";
    char rep[] = "war";
    char *p;
    
    p = str_replace(str, sea, rep);
    // ...
    
    char *str_replace(char *mainstring, char *search, char *replace)
    {
        char *output = new char[100];
        // ich bin mir nicht ganz sicher, aber musst du nach einem new den allokierten speicher erst noch mit nullen füllen?? ansonsten funktionieren dinge wie strcat nicht...
    
        char *token;
        token = strtok(mainstring, search);  // token zeigt auf folgende Stelle:
                                             //          V
                                             //   Das ist ein Test.
    
        // wieso hängst du hier an output token ran?? du solltest hier alles vor deinem token ranhänge, also die länge von search feststellen, von token subtrahieren und dann mit einen strncpy erst mal alles vor dem token, also "Das " in output kopieren
        strncpy (output, token-strlen(search), mainstring-(token-strlen(search)));
    
        // jetzt das zu ersetztende zeug rangängen
        strcat (output, replace);
        // und jetzt alles nach token (und darauf zeig token ja)
        strcat (output, token)
    
        //strcat(output, token);               // ACHTUNG, hier muss output eine null
                                             // terminierte Zeichenkette sein!!!
                                             // Wenn output null terminiert wäre,
                                             // würde folgendes in output stehen:
                                             // " ein Test."
    
        // was soll diese komische schleife??
        /*while(token = strtok(0,search))      // Hier findet er nichts mehr in
                                             // mainstring und überspringt hiermit
                                             // die Schleife
        {
            strcat(output, replace);
            strcat(output, token);
        }*/
        return output;                       // Es würde " ein Test." zurückgegeben
    }
    

    was jetzt noch nicht drinne ist, ist die unterstützung von mehreren ersetzungen, wenn nämlich search mehrmals vorkommt, geht aber ganz einfach, indem du einfach alles von "token = strtok(mainstring, search);" bis "return output;" in eine schleife setzt...



  • todo schrieb:

    char *output = new char[100];
    // ich bin mir nicht ganz sicher, aber musst du nach einem new den allokierten speicher erst noch mit nullen füllen?? ansonsten funktionieren dinge wie strcat nicht...
    

    Nein output muss eine Nullterminierte Zeichenkette sein.

    @ ςErnie?
    Das ganze nochmal gründlich überarbeiten und wenn du willst kann ich dir mal meine Lösung dieses Problems schicken, aber das soll ja zur Übung dienen deshalb probier es lieber noch einmal selber.


Anmelden zum Antworten