Remplacer toutes les occurrences d'une sous-chaîne dans une chaîne de caractères en C
Je suis en train de faire une fonction en C pour remplacer toutes les occurrences d'une sous-chaîne dans une chaîne. J'ai fait ma fonction, mais il ne fonctionne que sur la première occurrence de la sous-chaîne dans la plus grande chaîne.
Voici le code pour l'instant:
void strreplace(char string[], char search[], char replace[]){
char buffer[100];
char*p = string;
while((p=strstr(p, search))){
strncpy(buffer, string, p-string);
buffer[p-string] = 'void strreplace(char string[], char search[], char replace[]){
char buffer[100];
char*p = string;
while((p=strstr(p, search))){
strncpy(buffer, string, p-string);
buffer[p-string] = '\0'; //EDIT: THIS WAS MISSING
strcat(buffer, replace);
strcat(buffer, p+strlen(search));
strcpy(string, buffer);
p++;
}
}
'; //EDIT: THIS WAS MISSING
strcat(buffer, replace);
strcat(buffer, p+strlen(search));
strcpy(string, buffer);
p++;
}
}
Je ne suis pas nouvelle à la programmation en C, mais il me manque quelque chose ici.
Exemple: pour la chaîne d'entrée "marie a des pommes a", à la recherche de "a" et remplacer par "blabla"
Dans le premier "a" est remplacée correctement, mais le second ne l'est pas.
Le résultat final est "marie blabla pommes hasblabla". Remarquez le second "a" est toujours là.
Ce que je fais mal? 🙂
MODIFIER
Est travaille maintenant. En ajoutant le caractère null de la fin a résolu le problème.
Je sais que la chaîne résultante peut être plus grand que 100. C'est une école de devoirs donc je ne vais pas avoir des chaînes de plus de 20 ans ou plus.
- Probablement parce qu'ils ne sont pas dans la bibliothèque C standard? (Êtes-vous penser PHP?)
- Comment avez-vous vu le résultat? avec un débogueur?
- juste point, commentaire supprimé. Pensée les fonctions PHP en interne mappé à C stdlib (qui ils ont à faire beaucoup de temps), mais pas à ce cas.
- Cette fonction est un peu risqué que vous ne savez pas avec certitude si la chaîne d'entrée peut contenir 100 octets. Mais cela mis à part, votre
while
boucle uniquement par incrémentsp
de 1 à chaque passage dans la boucle. Je suppose qu'il doit frapper par la longueur de la chaîne de remplacement. - Aussi, ce sont
strcat(buffer, p+strlen(search));
etstrcpy(string, buffer);
sont pour? Vous n'avez pas vraiment besoin de la première ligne, et vous pouvez déplacer la deuxième sortie de la boucle...
Vous devez vous connecter pour publier un commentaire.
Pour commencer:
Cette ligne
pas nécessairement ajoute un
0
-terminateur de ce qui a été copié àbuffer
.La ligne suivante
toutefois s'appuie sur
buffer
être0
terminée.Comme
buffer
n'avait pas été initialisée et si le0
-terminator plus probable manque la dernière ligne peut très bien lire au-delà debuffer
's de la mémoire et avec cette invoquer l'infâme Comportement Indéfini.Il ne semble pas clair pour moi ce que l'algorithme que vous essayez de suivre, ça a l'air louche pour moi. Ce qui est probablement l'approche la plus simple est:
p
pointeur qui pointe juste après l'aiguilleAvertissement: Vous devez aussi être prudent sur la façon dont vous appelez votre fonction. Si la chaîne de remplacement est supérieure à l'aiguille, votre chaîne modifiée sera plus long que celui d'origine, donc vous devez vous assurer que votre tampon d'origine est assez long pour contenir la chaîne modifiée. E. g.:
D'entrée: marie a pommes a
De sortie: marie blabla pommes blabla
je trouve certaines nécessaire d'apporter des corrections en fonction..
voici une nouvelle fonction