Supprimer un caractere dans une chaine [Résolu/Fermé]

Signaler
-
 floflo07 -
Bonjour,
je programme en C++ et sans l'aide de fonction particuliere!
j'ai une chaine de caractere et je demande recherche un caractere a supprimer. l'acquisition de la chaine est OK, la recherche du caractere est OK, mais je ne sais pas comment supprimer ce caractere!
ex : chaine1 = 'bonjour';
recherche de 'j';
suppression de 'j';
chaine1 = 'bonour';

si vous pouvez m'aider, MERCI!!!!!!
Pof

9 réponses

Imagine que tu as une tête de lecture qui avance sur ta chaine, et une tête d'écriture qui écrit ce que tu lis sauf les 'e'.
Bref, t'as besoin d'une seule chaine et d'un seul parcours. C'est optimal.

void del_char(char* str, char c) //Enleve tous les c de str
{
   int id_read, id_write;
   id_read = 0;
   id_write = 0;

   while (str[id_read] != '\0')
   {
      if (str[id_read] != c)
      {
          str[id_write] = str[id_read];
          id_write++;
      }
      id_read++;
    }
    str[id_write] = '\0';
}
10
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 60511 internautes nous ont dit merci ce mois-ci

Messages postés
434
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
15 décembre 2008
379
Si tu doit supprimer un caractere dans la chaine directement (sans renvoyer une nouvelle chaine), il suffit de décaler tout les caractères, qui sont à droite de celui à supprimer, d'un caractère sur la gauche:

chaine de départ :
chaine1 => 'b'o'n'j'o'u'r'

suppression de j :
chaine1 => 'b'o'n' 'o'u'r'

décalage des caractères :
chaine1 => 'b'o'n'o'u'r' '


je pense qu'en C sa devrait donner un truc du genre :

pos <= position du caractère a supprimer. Dans bonjour, pos=3
i=pos;
while(chaine1[i]!='\0'){
  chaine1[i]=chaine1[i+1];
  i++;
}
Merci t'es un magicien !
ca, c'est une fonction qui marche!

void supprime(char *texte, char x)   // supprime x dans la chaine
{
int p ,i;
for(i=0;texte[i] != '\0';i++)
  {if (texte[i] == x)  // on a trouve
       {
        for(p=i;texte[p]!=0;p++)
        texte[p]=texte[p+1];
       }
   }
}  

amuse toi bien...!
Pof
Ton code fonctionne mais tu doit rajouter la ligne i--; a la fin du if sans cela tu sautera une lettre après la suppression de ton 'e'.
Merci j'avais oublier de le mettre sur mon code.
ma réponse est tardive mais vous savez qu'il existe une fonction en vb pour ca ?

ca donne :

sub EnleverLeJ()
dim ch as string
ch ="Bonjour"
ch = Replace(ch, "j", "")
'en gros cherche j et met un caractère vide à la place
end sub


et si le caractère est présent plus d'une fois mais que tu ne veux enlever qu'une fois tu met :
ch = Replace(ch,"j","",count:=1)

voila ;-)
dsl j'ai ce même prob et j'ai pas trouver de solution
car c'est correct i+1 et i mais ça marche pas par exemple si nous avons une chaine eeeee et on veut supprimer le 'e' alors qui me donne le solution
Bonsoir, ce poste date d'il y a bientôt 10 ans!

Mais, aujourd'hui, je suis face à ce problème!!!

Comment faire si il y a des eeeeeeeee comme ça? Ca n'en suprimme qu'un. J'essaye, mais je ne trouve pas pour l'instant!

Et je ne dois utiliser que ce que je connais, donc pas de fonctions, ou de librairie, enfin, que stdio.h

Merci d'avance!

Edit: je viens de voir un commentaire de 2005, il a plus de 10 ans ce post, wow!
Oh mon dieu, je crois que je viens de réussir, si ça intéresse quelqu'un !
Messages postés
365
Date d'inscription
mercredi 20 avril 2005
Statut
Membre
Dernière intervention
19 mai 2006
104
salut =)

tu veux pas utiliser la STL, ou autre bibliothèque où tout est déjà fait ?

sinon, je ferais un truc comme ça (algo, tu mettras en c):
tant que caractères
       si chaine[index] != caractere_a_enlever
                buffer[index2] = chaine[index]
                index2 ++
       fin si
       index ++
fin

bah en fait cet un exo de prog que j'ai a faire et la consigne est de tout faire sans aucune librairie particuliere.
j avais pensé à un truc comme :
if (chaine1modifiee[i] == caractere_a_supp)
{ chaine1modifiee[i] = chaine1[i+1]; }

avec chaine1 = 'bonjour';
si je veux supp le 'j'
chaine1modifiee[4] = chaine[5]
mais comment faire pour le reste de la chaine?
Messages postés
365
Date d'inscription
mercredi 20 avril 2005
Statut
Membre
Dernière intervention
19 mai 2006
104
ben comme j'ai mis plus haut : tu boucles tant qu'il y a des caractères à lire. Si le caractère lu est celui a supprimer, tu ne fais rien, sinon tu le mets dans ta nouvelle chaine.

il te faut donc 2 index et 2 chaines de caractères.
Messages postés
434
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
15 décembre 2008
379
La solution la plus bourine, c'est de relancer la fonction tant que le caractères "e" est trouvé.
Il y a surement un moyen de faire en sorte que cela soit plus optimisé, mais ca reste la solution de base.
Messages postés
50
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
4 juin 2014
52
Par un copié collé je me suis créé un fichier excel contenant malheureusement des caractères spéciaux que je voudrais maintenanat virer.
Comment faire pour remplacer des "□" par rien ou par un espace ??
je prends la fonction remplacer et je rentre ce "□" par un CTRL-V mais cela ne marche pas .
D'avance merci