Bonjour,

Je créé en ce moment une fonction qui remplace dans une chaîne donnée toutes les occurences d'une sous-chaîne donnée par une autre chaîne, et qui renvoie le nombre d'occurences remplacées. La taille du buffer est également donnée en paramètre.

J'aimerais que dans un cas comme celui-là :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
int n;
char s[10] = "bonjour";
n = STRU_replacestr(s, sizeof(s), "bon", "contre");
s contienne après remplacement "contrejou", avec s[9] contenant '\0', et n valant -1, signifiant que la chaîne a dû être tronquée. C'est cette fonctionnalité que je n'arrive pas à coder.

Voici le corps de la fonction actuelle :

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
int STRU_replacestr(char *s, size_t size, const char *toreplace, const char *replaceby){
 
	int count = 0;
 
	/* Test sécurité + efficacité */
	if(s && toreplace && replaceby && (s = strstr(s, toreplace))){
 
		char *p = s;
		const char *preplace = NULL;
		size_t toreplacelen = strlen(toreplace);
		long diff = (long)(strlen(replaceby) - strlen(toreplace));
 
		while(*p != '\0'){
 
			/* p est la sous-chaîne recherchée */
			if(*p == *toreplace && strncmp(p+1, toreplace+1, toreplacelen-1) == 0){
					/* On place le curseur après la sous-chaîne */
					p += toreplacelen;
					/* Si la chaîne de remplacement est plus grande que celle à remplacer,  */
					/* on décale les caractères pour laisser la place manquante et on place */
					/* le curseur à la suite de la place libérée                            */
					if(diff > 0){
						memmove(p + diff, p, strlen(p)+1);
						p += diff;
					}
					/* Ecriture de la sous-chaîne remplaçante */
					for(preplace = replaceby; *preplace != '\0'; s++, preplace++){
						*s = *preplace;
					}
					count++;
 
			/* Ecriture du caractère courant si besoin */
			} else {
				if(s != p){
					*s = *p;
				}
				s++, p++;
			}
 
		}
		*s = '\0';
	}
	return count;
}
Avez-vous des suggestions/solutions pour résoudre mon problème ? Merci par avance...