Partage
  • Partager sur Facebook
  • Partager sur Twitter

Supprimer toute les occurences d'une chaine de car

24 janvier 2020 à 15:13:56

Bonjour!

J'aimerai bien supprimer toute les occurrences  d'une chaîne de caractère dans une autre , je n'ai pas d'idée clair comment m'y prendre!! 

Aidez moi svp :D !!!!

  • Partager sur Facebook
  • Partager sur Twitter
24 janvier 2020 à 15:50:10

Salut, 

Je dirais via une boucle qui parcours ta chaîne et dès que tu trouves une occurrence tu décales tout vers la gauche de la longueur de l’occurrence.

Tu peux également faire une autre chaine copier l'une dans l'autre caractère par caractère et dès que tu trouves une occurrence tu ne copies plus puis continue après etc 

  • Partager sur Facebook
  • Partager sur Twitter
24 janvier 2020 à 15:59:10

Hello,

Les fonctions strlen(), strstr() et memmove() vont t'aider.

Pour un début, quelque chose du style

void removeString(char strin[],char str2remove[]) {
	char *p;
	while((p=strstr(strin,str2remove))!=NULL)
		memmove(p,....,....);
}		

Ceci est juste une piste (et oui, dans le code complet, on utilise strlen() )

-
Edité par edgarjacobs 24 janvier 2020 à 16:12:46

  • Partager sur Facebook
  • Partager sur Twitter

On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

25 janvier 2020 à 22:25:22

Avant de programmer :

la question n'est pas suffisamment précise.

On comprend bien que si on demande d'enlever  "ab" de "abcabd", il doit rester "cd".

Mais si c'est "aabbc" ?  Enlever "ab" laisse "abc", dont on pourrait encore supprimer "ab".

-
Edité par michelbillaud 25 janvier 2020 à 22:25:37

  • Partager sur Facebook
  • Partager sur Twitter
25 janvier 2020 à 22:50:35

michelbillaud exactement j'ai le même problème dans la tete , je veux supprimer ma chaîne de telle sorte qu'il en reste plus sa trace dans le résultat final.

-
Edité par Erreur 404ppp 25 janvier 2020 à 22:51:18

  • Partager sur Facebook
  • Partager sur Twitter
26 janvier 2020 à 1:41:31

Dans ce cas, il faut refaire le travail tant qu'on trouve des occurences. À moins qu'il existe un truc plus intelligent.
Par exemple, si j'ai la chaîne 'aaaaaaaaaabbbbbbbbbbccc' et que je ne veux plus de chaîne 'ab', je devrai recommencer 10 fois.
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

26 janvier 2020 à 10:08:14

Du coup il faudrait que la fonction qui efface les occurrences les compte : on bouclerait jusqu'à ce que cette fonction retourne 0 :

int removeString(char strin[],char str2remove[])
/* Retourne le nombre de 'str2remove' effacés */
while (removeString(chaine_a_traiter,"ab") != 0)
    /* au suivant... */
    ;




  • Partager sur Facebook
  • Partager sur Twitter
26 janvier 2020 à 19:48:00

@Robun: pas besoin de compter:
#include <stdio.h>
#include <string.h>

void removeString(char strin[],char str2remove[]) {
	int len=strlen(str2remove);
	char *p;
	while((p=strstr(strin,str2remove))!=NULL)
		memmove(p,p+len,strlen(p+len)+1);			// +1: déplace également le \0
}

int main(void) {
	char s1[]={"aaaabbbbbbbbbcdabcdcde"};
	char s2[]={"ab"};
	
	printf("%s %s\n",s1,s2);
	removeString(s1,s2);
	printf("%s\n",s1);
	
	return(0);
}	

Mais comme dit par michelbillaud: la question manque de précision

Edit: et on peut se passer de memmove() puisqu'on connait le sens du déplacement, en écrivant une fonction:

/* déplace également le \0 */
void myMemmove(char *dest,const char *src) {
	do *dest++=*src;
	while(*src++);
}


void removeString(char strin[],char str2remove[]) {
	int len=strlen(str2remove);
	char *p;
	while((p=strstr(strin,str2remove))!=NULL)
		myMemmove(p,p+len);
}

-
Edité par edgarjacobs 26 janvier 2020 à 19:55:56

  • Partager sur Facebook
  • Partager sur Twitter

On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

27 janvier 2020 à 1:30:04

@edgarjacobs:
Tu as une bonne maîtrise des fonctions de string.h (gestion de chaînes)
J'aime bien string2remove > stringTWOremove > stringTOremove
just 4 u
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.