string replacement und libxml2



  • Moin!

    Ich habe eine String-Replace Funktion, die mir Schnipsel eines Strings ersetzt. Diese sieht derzeit wie folgt aus:

    char *str_replace(char *str, char *sub, char *rep) {
    
    	// Token
    	char *tok = NULL;
    
    	// New string
    	char *newstr = NULL;
    
    	// Old string
    	char *oldstr = NULL;
    
    	/* if either substr or replacement is NULL, duplicate string a let caller handle it */
    	if ( sub == NULL || rep == NULL )
    		return str;
    
    	// Duplicate string
    	newstr = strdup (str);
    
    	// Run
    	while ( (tok = strstr ( newstr, sub ))){
    		oldstr = newstr;
    		newstr = malloc ( strlen ( oldstr ) - strlen ( sub ) + strlen ( rep ) + 1 );
    		/*failed to alloc mem, free old string and return NULL */
    		if ( newstr == NULL ){
    		free (oldstr);
    		return NULL;
    		}
    		memcpy ( newstr, oldstr, tok - oldstr );
    		memcpy ( newstr + (tok - oldstr), rep, strlen ( rep ) );
    		memcpy ( newstr + (tok - oldstr) + strlen( rep ), tok + strlen ( sub ), strlen ( oldstr ) - strlen ( sub ) - ( tok - oldstr ) );
    		memset ( newstr + strlen ( oldstr ) - strlen ( sub ) + strlen ( rep ) , 0, 1 );
    		free (oldstr);
    	}
    	free(str);
    
    	return newstr;
    }
    

    Soweit funktioniert das ganze auch. Nun will ich aber XML-Dateien manipulieren und nutze hierfür libxml2. Und genau da gibts probleme mit der Funktion, denn irgendwie scheinen die Strings des libxml2 Dokuments keine gewöhnlichen Strings zu sein. Valgrind schmeißt mit Fehlermeldungen um sich (free(str); am ende ist das Problem, und es kommt zum Memory leak.

    Habe schon versucht die Strings auf alle möglichen Weisen zu duplizieren. Nichts! Es ist einfach nur zum verzweifeln.

    Was ich bisher probiert hab:

    // 1
    node->content = f(node->content);
    
    // 2
    node->content = f((char *)node->content);
    
    // 3
    char *str = strdup(node->content);
    str = f(str);
    free(node->content);
    node->content = str;
    
    // 4
    char *str = strdup(node->content);
    str = f(str);
    xmlNodeSetContent(node, str);
    free(str)
    

    Wobei f die funktion ist die den Stringinhalt bearbeiten soll.

    Hat jemand von Euch da evtl. irgendwelche Tips wie man das Ganze zum Laufen bekommt!?

    Danke schonmal. 🙂



  • - gewöhne dir an, einen Kommentarstil zu verwenden und nicht beide
    - strdup ist kein Standard
    - deine Funktion arbeitet nicht für auto-Speicher
    - du benötigst nur neuen malloc-Speicher, falls strlen(rep)>strlen(sub) und wenn zuvor nicht ausreichend Gesamtspeicher für str reserviert wurde

    Soweit funktioniert das ganze auch.

    Offensichtlich wohl nicht. Anfängerfehler zu meinen, wenn der Compiler was übersetzt und triviale Testdaten funktionieren, dass der Code fehlerfrei ist

    Nun will ich aber XML-Dateien manipulieren und nutze hierfür libxml2. Und genau da gibts probleme mit der Funktion, denn irgendwie scheinen die Strings des libxml2 Dokuments keine gewöhnlichen Strings zu sein.

    Todsünde, an der API einer verwendeten Bibliothek vorbei Daten manipulieren zu wollen.

    Valgrind schmeißt mit Fehlermeldungen um sich (free(str);

    Valgrind hat immer recht.

    Schaue dir die API von libxml2 vollständig an und suche dort nach Funktionen, die deine Aufgabe ausführen können.


Anmelden zum Antworten