Comment supprimer toutes les occurrences d’un caractère donné d’une chaîne en C?

J’essaie de supprimer un caractère d’une chaîne en C. Le problème que j’ai avec mon code est qu’il supprime la première instance du caractère de la chaîne mais efface également tout ce qui suit la chaîne. Par exemple, supprimer “l” de “bonjour” affiche “il” plutôt que “heo”

int i; char str1[30] = "Hello", *ptr1, c = 'l'; ptr1 = str1; for (i=0; i<strlen(str1); i++) { if (*ptr1 == c) *ptr1 = 0; printf("%c\n", *ptr1); ptr1++; } 

J’ai besoin d’utiliser des pointeurs pour cela et j’aimerais que ce soit aussi simple que possible puisque je suis débutant en C. Merci

Vous pouvez le faire comme ça:

 void remove_all_chars(char* str, char c) { char *pr = str, *pw = str; while (*pr) { *pw = *pr++; pw += (*pw != c); } *pw = '\0'; } int main() { char str[] = "llHello, world!ll"; remove_all_chars(str, 'l'); printf("'%s'\n", str); return 0; } 

L’idée est de conserver des pointeurs de lecture et d’écriture séparés ( pr pour la lecture et pw pour l’écriture), toujours avancer le pointeur de lecture et de faire avancer le pointeur d’écriture uniquement lorsqu’il ne pointe pas vers un caractère donné.

Si vous supprimez les caractères en place, vous devrez déplacer le rest de la chaîne d’un endroit vers la gauche chaque fois que vous supprimez un caractère, ce qui n’est pas très efficace. Le meilleur moyen est d’avoir un deuxième tableau qui prend la chaîne filtrée. Par exemple, vous pouvez changer votre code comme ceci.

 int i; char str1[30] = "Hello", *ptr1, c = 'l'; char str2[30] = {0}, *ptr2; ptr1 = str1; ptr2 = str2; for (i=0; i 
 char str1[30] = "Hello", *prt1, c = 'l'; char str2[30], *prt2; prt1 = str1; prt2 = str2; while(*prt1 != 0) { if(*prt1 != c) { *prt2 = *prt1; prt2++; } prt1++; } *prt2 = '\0'; 

Le problème est que lorsque vous rencontrez le premier caractère qui correspond à c , vous insérez un caractère null à cet endroit. Cela signifie que vous coupez le rest de la ficelle.

Ce que vous devez faire, c’est lorsque vous trouvez un caractère correspondant, déplacez les caractères suivants d’une position. Ensuite, vous devez insérer le caractère null à la fin, en fonction du nombre de caractères que vous avez supprimés.

Je sais que c’est un type de réponse en double, mais ce code est la version de la fonction permettant de résoudre le problème. Je pensais que l’interrogateur étant un débutant, il pourrait apprendre beaucoup d’une version décomposée du problème.

 int del_x_char(char *p, int x) { char *q; x=first_occurance(p, 'i')/*you can replace any character that you want delete with 'i'*/ q=p+x; while(*q=*(q+1)) q++; *q='\0'; return 0; } int first_occurance(char *q, char phar) { int i=0; while(*q) { if(*q++==phar) return i; i++; } return -1; } 

il suffit de changer

 if (*ptr1 == c) *ptr1 = 0; 

à

 if (*ptr1 == c) continue; 

comme @ouah l’a dit, il se brise au premier caractère NULL ..

C définit une chaîne de caractères comme “une séquence contiguë de caractères terminée par et incluant le premier caractère nul