Textersetzungsalgorithmus segfaulted ...



  • Hallo, ich hab hier ein Programm,
    dass in einem Text nach substrings suchen soll, und sie durch einen anderen ersetzen soll. aber das Programm ersetzt nicht wirklich, und ich habe keine ahnung warum ...

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

    eigentlich mache ich nichts anderes, als wenn ich ein vorkommen gefunden habe,
    bis eins davor alles abzukopieren, den neuen string einfügen, und den Rest anhängen.
    hat jemand ne idee?



  • Wo passiert welcher Fehler?



  • er ersetzt nicht die subtexte im string.
    er geht 2x durch die schleife, und segfaulted.
    keine ahnung warum



  • hab jetzt auch nicht gerade den nerv mich durch deinen quellcode zu quälen aber letztens hab ich gerade zu diesem problem ne lösung gepostet

    einziger unterschied zu deinem ist das der übergebene string inp mit dem neuen inhalt überschrieben wird (er muss also bereits mit malloc allokiert sein) wenn du das nicht willst kannst du es ja auch leicht umschreiben...

    int ersetzen(char *such, char *neu, char **inp,int *inp_l){ 
    int offset,x=strlen(neu),y=strlen(such),z=strlen(*inp),rv=0; 
    char *str,*tmp; 
    
        while(str=strstr(*inp,such)){ //substring such im string *inp suchen 
            ++rv;                    //inkrementieren der anzahl der gefundenen ersetzungen 
            z+=x-y;                    //neue zeichenanzahl von *inp errechnen                    
    
            if(*inp_l<=z){            //wenn *inp nicht gross genu 
                offset=str-*inp;    //offset merken 
                tmp=(char*)realloc(*inp,sizeof(char)*(z+1));    //feld entsprechneder grösse allokieren 
                if(tmp){*inp=tmp;*inp_l=z+1;str=*inp+offset;}    //ursprungszustand der zeiger herstellen 
                else return -1; 
            } 
    
               memmove(str+x,str+y,sizeof(char)*strlen(str+y-1));    //werte im array nach dem zu ersetzenden verschieben 
            memcpy(str,neu,sizeof(char)*x);                        //neu zeichenfolge in *inp kopieren 
    
        } 
    
        return rv; //fertisch 
    }
    


  • Der Fehler ist ganz einfach. Wenn man sich die Dokumentation von strncat() mal genau durchliest, dann erfährt man, dass das Stringendezeichen nicht automatisch hinten drangehängt wird, d. h. das muss man noch "per Hand" machen.


Anmelden zum Antworten