Programme c qui supprime les répétitions de caractére identique

jihane-se Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   -  
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   -
Salut à tous
svp j'ai besoin votre aides svp je veux faire un programme c qui supprime d'une chaine de caractére les répétions de caractéres consécutifs.par exemple remplacer la chaine AAAABBCCC par ABC
MERCII bcp !!
A voir également:

3 réponses

gardiendelanuit Messages postés 1770 Date d'inscription   Statut Membre Dernière intervention   264
 
Bonjour,

Je t'invite à regarder de ce côté https://stackoverflow.com/questions/779875/what-function-is-to-replace-a-substring-from-a-string-in-c

De nombreuses possibilités sont présentes, mais que je sache, il n'y a pas de fonction native en C qui soit pour ce besoin.
0
jihane-se Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Ok merciii bcp à votre réponse :)
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
cette question sur SO ne répond pas à la question "Comment supprimer d'une chaine de caractére les répétions de caractéres consécutifs", mais "Comment remplacer, dans une chaîne, une sous-chaîne par une autre".

Dal
0
gardiendelanuit Messages postés 1770 Date d'inscription   Statut Membre Dernière intervention   264 > [Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention  
 
Oui c'est ce que j'ai d'ailleurs signalé. J'ai préféré prendre la question du corps du topic :D
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
Salut jihane-se,

Tu peux passer par une autre chaîne ayant au moins la taille de la chaîne de départ, et où tu copies les caractères non consécutifs jusqu'au caractère '\0'.


Dal
0
jihane-se Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Salut Dal
Mercii à toi :D
j'essai de faire ce programme mais je ne c'est pas est ce qu'il est juste

#include <stdio.h>
void main()
{
char txt[20];
int L,i,j;
L=strlen(txt);
for(i=0;i<L;i++)
for(j=i+1;j<L;j++)
if(txt[i]==txt[j])
txt[i]=txt[j];

}
svp repondez moi est ce qu'il est juste car je suis encore débutante en programmation :))
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846 > jihane-se Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,

void main()
Le bon prototype est : int main(void).
De plus, il ne faut pas oublier le return 0; en fin de main().

Dans ton code, il manque la lecture de la variable txt. Par exemple : scanf("%19s", txt);

Ensuite, ton programme ne gère par les lettres consécutives, juste les lettres doublons.
Il faut copier uniquement les caractères lorsque le caractère est différent du précédent (txt[i] != txt[i-1]). Et une seule boucle for suffit.


Merci pour la prochaine fois d'utiliser la balise <code c>.
Exemple :
<code c>ici tu mets ton code</code>
0
jihane-se Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   > fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention  
 
Boonjour fiddy
Mercii à votre reponse,donc d'aprés vous le programme doit étre comme ceci:

#include <stdio.h>
void main()
{
char txt[20];
int L,i,j;
L=strlen(txt);
for(i=0;i<L;i++)
if(txt[i]!=txt[i+1])
txt[i]=txt[i+1];

}
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846 > jihane-se Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Tu as pris en compte la moitié de mes remarques.
Je te laisse donc relire mon poste. Pour la balise, c'est code c. Et non code tout court.

Tu as mal géré les conditions aux limites. Imagine lorsque i=L-1 ce que donnera ton if...

Ensuite il faut copier à partir de 0 à l'indice j (oui il faut une autre variable).
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
@jihane-se :
Si on fait une opération destructive, on n'a pas besoin d'une autre chaîne comme je le disais, mais juste de deux pointeurs sur char qui vont parcourir la chaîne, l'un servant à lire les caractères et vérifier s'ils sont répétés consécutivement, et l'autre servant à écrire au bon endroit les caractères écrasant les anciens. Chaque pointeur est incrémenté selon son rôle jusqu'à la lecture et écriture du '\0' final.

Bien sûr, on peut le faire aussi avec deux indices sur le même tableau. Je suppose que c'est vers cette solution que fiddy essaye de te guider.

Par ailleurs, on n'est pas obligé d'exécuter strlen, qui est une perte de temps car cette fonction doit parcourir toute la chaîne jusqu'au '\0', or c'est précisément ce que tu dois faire ensuite... Tu peux donc juste tester si tu rencontres '\0' à l'occasion du traitement de ta chaîne.


Dal
0
jisisv Messages postés 3645 Date d'inscription   Statut Modérateur Dernière intervention   934
 
Ceci devrait t'inspirer:
   
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

 int unrepeat(const char *src, char *dest)
 {
   char *d;
   int i, l, r;

   d = dest;
   r = 0;

   l = strlen(src);

   for ( i = 0 ; i < l ; i++)
     {
       if ( src[i +1 ] != src[i] )
	 {
	   *d = *(src + i);
	   d++ ;
	   r++;
	 }
     }
   *d = 0;
   return r;
 }     
 
int main(int argc, char *argv[])
{
  char *dest;
  int nc ; 
  if( argc > 1 )
    {
      dest = malloc(strlen(argv[1]) +1) ;

      if ( NULL != dest )
	{
	  //in place modification
	  //dest = argv[1];
   
	  printf("Old string: %s\n", argv[1]);
	  nc  = unrepeat(argv[1], dest);
	  printf("New string %s\n%d\n", dest, nc);
	  return EXIT_SUCCESS;
	}
    }
  return EXIT_FAILURE;
}


Gates gave ^W  sold  you the windows.
GNU gave us the whole house.(Alexandrin)
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Bon, beh, tu as tout dit.

Quelques remarques quand même sur le code pour que jihane-se puisse finaliser le code.

Pour éviter d'utiliser strlen() plusieurs fois, tu peux le mettre dans une variable et passer la taille en argument de unrepeat().

Les conditions aux limites ne marchent pas non plus :-).
Et enfin, il manque un return à la fin du main() cas où argc==1.
0
jisisv Messages postés 3645 Date d'inscription   Statut Modérateur Dernière intervention   934
 
Il est normal de devoir utiliser strlen deux fois. On pourrait faire un test sur la valeur de src[i+1] , mais j'ai écarté cela dans un but de clarté et de pédagogie.
Le strlen du main est "incontournable" pour malloc. Il n'y a aucune raison d'utiliser une variable globale.

Pour le return , tu as raison. Le code a été corrigé.
As-tu un exemple de bug pour les conditions aux limites ?
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Salut jisisv,

Qui a parlé de variable globale ? Je parle d'une variable locale que tu envoies en argument de unrepeat().
Exemple :
<code c>
if (argc > 1) {
int taille = strlen(argv[1]);
char *dest = malloc(taille+1) ;

if (dest != NULL) {
int nc = unrepeat(argv[1],test, taille);
...
}

Ainsi dans unrepeat(), tu as la taille directement. En plus, tu as dit toi-même :
on n'est pas obligé d'exécuter strlen, qui est une perte de temps car cette fonction doit parcourir toute la chaîne jusqu'au '\0'
Ici encore, dans ta fonction unrepeat() tu peux l'éviter.

Non pas de bugs... C'est juste dommage de faire une itération supplémentaire inutile.
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
@fiddy : ce n'est pas jisisv qui a dit "Par ailleurs, on n'est pas obligé d'exécuter strlen, qui est une perte de temps car cette fonction doit parcourir toute la chaîne jusqu'au '\0', or c'est précisément ce que tu dois faire ensuite... Tu peux donc juste tester si tu rencontres '\0' à l'occasion du traitement de ta chaîne.", c'est moi :-)

Dal
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846 > [Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention  
 
Gloups. Je retire ce paragraphe alors :-).
0

Discussions similaires