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 !!
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
Fatalis
"La femme est le chef-d'oeuvre de Dieu, surtout quand elle a le diable au corps" Alphonse Allais
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.
"J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone."-Bjarne Stroustrup
www.stroustrup.com
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
Fatalis
"La femme est le chef-d'oeuvre de Dieu, surtout quand elle a le diable au corps" Alphonse Allais
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Long = (size_t)pos -(size_t)txt;
Et euh... ta solution m'a l'air bien alambiquée.
"J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone."-Bjarne Stroustrup
www.stroustrup.com
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
Fatalis
"La femme est le chef-d'oeuvre de Dieu, surtout quand elle a le diable au corps" Alphonse Allais
J'ai une solution qui marche que je viens de développer !!
(Pensez à inclure string.h et stdlib.h)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager