Problem mit einem String-Programm



  • Hallo,

    ich hab ein Programm geschrieben (mit meinen Grundkenntnissen) die folgendermassen funktioniert:

    von 3 Eingabeparameter z.b.: Message age ed
    bekommt man Messed

    Und irgendwas funktioniert nicht, aber verstehe ich leider nicht wieso.
    Hier ist die Kode:

    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    char* replaceSubstring (char* string, char* substring, char* newsubstring)
    {
    	char *ptr,
           *output = 0,
           *str;
    
    	int found = 0;
    
    	str = strdup(string);
    	while ((ptr = strstr(str,substring))) {
    		found = 1;
    		ptr = 0;
    		output = realloc(output,strlen(output)+strlen(str)+strlen(newsubstring)+1);
    		strcat(output,str);
    		strcat(output,newsubstring);
    		str = ptr + strlen(substring);
    	}
    	if (!found) return strdup(string);
    	output = realloc(output,strlen(output)+strlen(str)+1);
    	strcat(output,str);
    	return output;
    }
    
    int main (int argc, char** argv)
    {
    	char	*out;
    
    	if (argc<4) {
    		puts("Usage: subst <string> <substring> <new substring>");
    		return 1;
    	}
    	out = replaceSubstring(argv[1], argv[2], argv[3]);
    	printf("%s\n", out);
    	free(out);
    	return 0;
    }
    

    Vielen Dank im Voraus



  • vielleicht bin ich zu blöd, aber aus deinem text wird mir nicht ganz klar was du eigentlich vor hast!

    was geht denn nicht?

    btw..nimm std::string und nicht char*



  • Was er vorhat ist 3 Parameter eingeben, wovon der 2. ein substring des 1. ist. Dieser wird dann aus dem 1. String geloescht und durch den 3. String ersetzt. Scheint mir zumindest so.

    Was an dem ganzen Code ist eigentlich jetzt wirklich C++? Ich sehs nicht so recht (kenn mich in beiden Sprachen noch nicht gut aus) aber irgendwie siehts nach C-Code aus in meinen unerfahrenen Augen.

    EDIT: kann es sein, dass in der while-Schleife ein = fehlt? = ist ne Zuweisung, == ein Vergleich, oder hab ich (mal wieder) was uebersehen?



  • Shinja schrieb:

    Was er vorhat ist 3 Parameter eingeben, wovon der 2. ein substring des 1. ist. Dieser wird dann aus dem 1. String geloescht und durch den 3. String ersetzt. Scheint mir zumindest so.

    Das könnte Sinn machen, auch wenn er sich offenbar etwas mit seinen Zeigern verknotet hat. In C++ würde ich ebenfalls Strings nehmen (und in meinem Magazin-Artikel gibt es auch eine Beispielfunktion, um alle Vorkommen eines Teilstrings ersetzen zu können).

    EDIT: kann es sein, dass in der while-Schleife ein = fehlt? = ist ne Zuweisung, == ein Vergleich, oder hab ich (mal wieder) was uebersehen?

    In dem Fall dürfte das = tatsächlich richtig zu sein (im Gegensatz zu den Berechnungen IN der Schleife) - man: strstr gibt NULL (alias false) zurück, wenn es nichts gefunden hat.



  • Ja was Shinja gesagt hat ist richtig, also das ist der Sinner des Programms.
    Ihr habt auch fur Folgendes, die Kode ist nicht C++ sondern genau C, aber ich dachte hier kann ich es auch posten.

    Und irgendwelche Ideen ?



  • Perffy schrieb:

    Ihr habt auch fur Folgendes, die Kode ist nicht C++ sondern genau C, aber ich dachte hier kann ich es auch posten.

    Ja, hier gibt es auch eine Abteilung für C, aber die ist eine Etage höher (das Board "Ansi C") - wart' einfach mal, bis dich ein Mod rüberschiebt.

    Ansonsten: Was genau bedeutet "funktioniert nicht"? Lässt sich das Programm compilieren? Was für Werte liefert es?

    Mir fallen auf Anhieb zwei mögliche Fehler auf:
    Erstens könnte es sein, daß du zu viel Speicher anlegst (überdenk' nochmal deine Längenberechnung) und kopierst. Das solltest du mal von Hand (oder im Debugger) durchrechnen.
    Und zweitens initialisiert realloc() den zurückgegebenen Speicher nicht - das heißt, du hast irgendwelche Müll-Daten übergeben bekommen und strcat() fängt an der ersten 0 an, deinen String einzutragen (der Müll bleibt am Anfang stehen).

    Für das erste müsste ich deine Funktion im Detail verstehen, für das zweite Problem mußt du deinen Ausgabe-Speicher korrekt initialisieren:

    char *ptr,
         *output = calloc(1,1),
         *str;
    ...
    

    (PS: Und außerdem solltest du die angelegten Speicherblöcke auch wieder freigeben)



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Das Programm lasst sich kompilieren, aber leider funktioniert wie es soll.

    Ich sollte auch fur die Fehlerbehandlung keine Debugger benutzen erst, weil ich weiss noch nicht und zweitens darf ich nicht.



  • Perffy schrieb:

    Das Programm lasst sich kompilieren, aber leider funktioniert wie es soll.

    Ich sollte auch fur die Fehlerbehandlung keine Debugger benutzen erst, weil ich weiss noch nicht und zweitens darf ich nicht.

    Kannst du diesen Beitrag mal bitte in verständlichem Deutsch formulieren (oder darfst du Duden auch nicht 😃 *scnr*)? Ich bin zwar in der Lage, gewisse grammatikalische Unzulänglichkeiten zu überlesen, aber irgendwo ist dann doch Schluß.



  • Ops sorry

    als ich jetzt meinen Beitrag gelesen habe ... und ja ist total falsch 😕

    Also:

    Das Programm kann ich schon kompilieren, aber leider funktioniert nicht wie es soll.
    Z.b: Bei einem Aufruf

    ./prog message age ed
    Segmentation Fault (core dumped)

    Und zu dem Debugger, ich hab noch nie einen benutzt und auch mit ist es gesagt das Programm ohne Debugger zu schreiben.



  • Hast du mal versucht, den calloc()-Aufruf von oben mit reinzubauen?

    (ansonsten ist es immer von Vorteil, sich den Programmablauf im Debugger anzusehen - wenn alles nichts hilft, kannst du immer noch Hardcore-Debugging anwenden (indem du an wichtigen Stellen Kontrollmeldungen an stderr schreibst))



  • ich hab statt *output=0

    das
    *output=calloc(1,1)

    geschrieben, aber immer noch geht nicht. Mit dem Beispiel bekomme ich das von fruher:
    Segmentation Fault (core dumped)



  • Vllt. hilft dir ja das:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char * replaceSubstring(char *str, char *substring, char *newsubstring) {
    	char *result = strstr(str, substring);
    	if (result == 0)
    		return 0;
    
    	size_t len = strlen(str)-strlen(substring)+strlen(newsubstring)+1;
    	char *output = calloc(len, sizeof(char));
    
    	strncpy(output, str, result-str);
    	strncat(output, newsubstring, strlen(newsubstring));
    	strcat(output, result+(strlen(substring)));
    
    	return output;
    }
    
    int main(int argc, char **argv) {
    	if (argc < 4) {
    		perror("Prick!!");
    		return -1;
    	}
    
    	char *out = replaceSubstring(argv[1], argv[2], argv[3]);
    	printf("%s\n", out);
    	free(out);
    	return 0;	
    }
    


  • Danke dir, die Funktion macht das was ich brauche. leider ich muss die Funktion, die ich eingegeben habe "reparieren". Die hat Fehler, die ich beseitigen muss, leider weiss ich nicht wie.
    ich hab verstanden, dass es Probleme auf folgenden Zeilennummer vorhanden sind:

    9, 18, 21

    kann jemand mir helfen

    oder mir sagen wie kann ich mit dem Debugger unter Linux arbeiten.
    Ich hab probiert auf jeder Zeile einen Breakpoint zu setzen und dann mit step zu schauen was es kommt, aber irgendwie geht nicht 😢


Anmelden zum Antworten