Bonjour à tous,
je cherche à remplacer tous les caractères codés html ("é", etc.) par l'équivalent lisible ("é", etc.).
Quelqu'un a une idée d'une lib en C qui le fait?
Merci
Bonjour à tous,
je cherche à remplacer tous les caractères codés html ("é", etc.) par l'équivalent lisible ("é", etc.).
Quelqu'un a une idée d'une lib en C qui le fait?
Merci
Tellement oui...
Tien j'ai fait une fonction pour remplacer des caractères :
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 void str_replace(char *quoi, char *parquoi, char *content, char *buf) { int i, x, s = 0; if (strlen(quoi) > strlen(content) || strlen(parquoi) > strlen(content)) { return; } sprintf(buf, "%s", content); for (i = 0; i < strlen(content); i++) { for (x = 0; x < strlen(quoi); x++) { if (quoi[x] == content[i+x]) { s = 1; } else { s = 0; break; } } if (s == 1) { memcpy(buf + strlen(content) - strlen(&content[(i+x)-strlen(quoi)]), parquoi, strlen(parquoi)); memcpy(strlen(parquoi) + buf + strlen(content) - strlen(&content[(i+x)-strlen(quoi)]), &content[(i+x)], strlen(&content[(i+x)-strlen(quoi)])); } } }
Omg...
Bon les enfants, les traitements sur les chaines, c'est pas simple.. Pour des fonctions de transformation de chaines, faut définir où on va ecrire les caracteres, si c'est à l'appellant de preparer la zone de sortie ou à la fonction. De ça depend comment on va s'organiser pour utiliser une telle fonction. Si on croit avoir fait une fonction generique qui est utile dans tous les cas, on se fourre le doigt dans l'omoplate jusqu'à l'iris car ça impliquerait de devoir se plier aux exigences de la dite fonction dans certains cas.
Ainsi, il n'y a pas 1 fonction de remplacement de chaines dans une chaine, il y en a 72. Enfin ça c'est vrai si on a des considerations sur l'optimisation. Yen a beaucoup moins si on se fiche des traitements inutiles qui peuvent être faits (mais c'est pas mon cas).
A part ça, je releve quelques erreurs dans la fonction de ParaBol :
- des strlen() à tout va => implique de reparcourir la chaine concernee à chaque fois. Ce n'est pas comme dans d'autres langages où les objets chaines disposent d'un attribut "length" ou d'une methode length() qui clairement se contentent de recuperer un attribut interne sans reparcourir la chaine.
- seuls les caractères pointés par buf sont modifiés, les autres non. Les autres paramètre "char *" devraient plutot etre "const char *". Cela permettrait de passer une chaine litterale (les expressions entre guillemets) dans un des trois premiers paramètre.
- j'ai un peu lu en diagonale, mais j'ai des doutes sur le fait qu'il ya des chaines valides dans buf (pas de \0, ou pas au bon endroit).
Merci, pas fait attention, erreur que je fait fréquemmentdes strlen() à tout va => implique de reparcourir la chaine concernee à chaque fois
Je recopi dans "buf" la variable "content", toute les autres (quoi, parquoi) contiennent forcément le \0 final.j'ai un peu lu en diagonale, mais j'ai des doutes sur le fait qu'il ya des chaines valides dans buf (pas de \0, ou pas au bon endroit).
Donc quoi qu'il arrive la chaine "buf" sera valide
Oui mais tu copies pas le \0 de "pourquoi" par exemple
Si tu voulais aussi copier le \0 de "pourquoi" faudrait prendre "strlen(pourquoi) + 1"
Code : Sélectionner tout - Visualiser dans une fenêtre à part memcpy(buf + strlen(content) - strlen(&content[(i+x)-strlen(quoi)]), parquoi, strlen(parquoi));
Non car là, la chaine s'arreterai après le remplacement.
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