Salut
Je voudrais savoir s'il existe une fonction qui permet de remplacer un mot par un autre dans une chaine de caracteres ?!
C'est juste pour savoir car sinon, j'ai deja une solution de faite mais je me posait la question !!
Version imprimable
Salut
Je voudrais savoir s'il existe une fonction qui permet de remplacer un mot par un autre dans une chaine de caracteres ?!
C'est juste pour savoir car sinon, j'ai deja une solution de faite mais je me posait la question !!
si tu veux parler d'une instruction toute faite comme strlen strcmp ... je ne pense pas ceci dit un compilateur particulier peut toujours proposer ce type de commande WHY NOT.
oui, le plus simple est de la reprogrammer, ainsi tu peux toujours la modifier a souhait comme tu en as besoin, et l'avantage est que tu connais precisement son fonctionnement :)
Le truc c'est que j'ai cru entendre une fois qu'il y avait une fonction qui permettait d'insérer dans une chaine une autre chaine a une position donnée !!
Je me demandais si j'avai révé ou pas !! :?
N'existe pas dans le standard.
la methode n'est pas dure, tu ecrit d'abord une fonction de cherche d'une chaine dans une autre, ensuite tu t'en sert pour trouver ton mot, et une fois que tu l'as tu tronc la chaine en 2 variables, chacune excluant le mot a remplacer, puis quand tu as tes deux variables + ton nouveau mot a inclure, tu concatene le tout et c'est regler
ensuite si tu veux faire une fonction qui remplace tout les mots, bin tu re-itere l'operation jusqu'a ce que ton parsing de chaine est atteint sa fin :)
Code qui fonctionne à coup sûr (je l'utilise depuis plusieurs mois dans ma calto) :
Ca renvoie une nouvelle chaîne, ou NULL si txt ne contient pas la sous-chaîne "Avant".Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 //----------------------------------------------------------------------------- // Remplace toutes les occurances de Avant par Apres dans la chaine txt, puis // renvoie un pointeur sur la nouvelle chaine créée. Renvoie NULL s'il txt // ne contient aucune occurance de Avant. char* str_replace (const char* txt, const char* Avant, const char* Apres) { const char* pos; // Position d'une occurance de Avant dans txt char* TxtRetour; // La chaine retournée size_t PosTxtRetour; // Position du prochain caractère à écrire // dans TxtRetour size_t Long; // Long d'une chaine à écrire dans TxtRetour size_t TailleAllouee; // Taille allouée à TxtRetour // Cherche la première occurancce pos = strstr (txt,Avant); // Aucune occurance : renvoie simplement une copie de la chaine if (pos == NULL) return NULL; // Alloue une nouvelle chaine Long = (size_t)pos -(size_t)txt; TailleAllouee = Long +strlen(Apres)+1; TxtRetour = (char *)malloc(TailleAllouee); PosTxtRetour = 0; // Copie la première partie de la chaîne sans occurance strncpy (TxtRetour+PosTxtRetour,txt,Long); PosTxtRetour += Long; txt = pos+strlen(Avant); // Ajoute la chaîne de remplacement Apres Long = strlen(Apres); strncpy (TxtRetour+PosTxtRetour,Apres,Long); PosTxtRetour += Long; // Cherche la prochaine occurance pos = strstr (txt,Avant); while (pos != NULL) { // Agrandit la chaine Long = (size_t)pos -(size_t)txt; TailleAllouee += Long+strlen(Apres); TxtRetour = (char *)realloc(TxtRetour,TailleAllouee); // Copie ce qu'il y a entre la dernier occurance et la nouvelle strncpy (TxtRetour+PosTxtRetour,txt,Long); PosTxtRetour += Long; // Passe l'occurance txt = pos+strlen(Avant); // Ajoute la chaîne de remplacement Long = strlen(Apres); strncpy (TxtRetour+PosTxtRetour,Apres,Long); PosTxtRetour += Long; // Cherche la prochaine occurance pos = strstr (txt,Avant); } // Ajoute le reste de la chaîne (il reste au moins '\0') Long = strlen(txt)+1; TailleAllouee += Long; TxtRetour = (char*)realloc(TxtRetour,TailleAllouee); strncpy (TxtRetour+PosTxtRetour,txt,Long); return TxtRetour; }
C'est tirée de ma librairie (C++), donc y'a p'têtre qq. problèmes de compilation. Il est peut-être possible d'encore optimiser ça un poil, mais tant que ça marche ...
@+ Haypo
Ce double cast est complètement inutile.Citation:
Code:Long = (size_t)pos -(size_t)txt;
Et euh... ta solution m'a l'air bien alambiquée.
je dirais meme que ce double cast est assez dangereux... difference d'adresse, hummm... je sais pas, a chacun ca methode :)
j'aurais bien poster le mien, mais... il n'est pas plus farfelue mais disont que j'utilise 2/3 fonctions que j'ai re-ecrite et que bcp trouverais inutile
J'ai une solution qui marche que je viens de développer !! :D
(Pensez à inclure string.h et stdlib.h)
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 char* str_replace(char* str, char* pattern, char* sub) { char* buff = 0; buff = (char*)malloc(sizeof(char*)*255); while(*str != '\0') { if(*str == *pattern) { strcat(buff, sub); } else { strcat(buff, str); } *str++; } return buff; }