Supprimer la répétition une chainedecaractère

Résolu
tariktrk Messages postés 46 Date d'inscription   Statut Membre Dernière intervention   -  
tariktrk Messages postés 46 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
j'ai un petit problème avec ce exercice
écrire une fonction , nommée supprime_repetition ,qui supprime d'une chaine de caractères les répétition de caractères identiques consécutifs,la fonction ne doit pas créer une suite de plusieurs caractére identiques par un seul de ces caractères. la fonction ne dois pas créer une nouvelle chaine de caractères mais modifier la chaine qui lui est transmise comme paramètre, la fonction retourne la longueur de la nouvelle chaine ;
exemple la fonction devera transformer la chaine "aaabbccccdee" en la chaine "abcde" et retourne 5
écrié un programme c qui lit de puis le clavier une chaine txt,fait appel a la fonction supprime repitition puis affiche la chaine txt et sa longueur .
ma tentation est comme c est dessus mais ça ne marche pas vous pouviez m'aidera le faire corriger svp
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

void supprime_repitition(char txt[])
{int i,j,n,l;
l=strlen(txt);
for(i=0;i<l;i++)
{printf("%d\n",strcmp((txt+i),(txt+i+1)));
if(strcmp((txt+i),(txt+i+1))==NULL)
{for(j=i;j<l;j++)txt[j]=txt[j+1];}
}


printf("%s %d",txt,strlen(txt));

}
main()
{char txt[50];
printf("entrez une texte(de -49 caractaire\n");
gets(txt);
printf("%s\n",txt);

supprime_repitition(txt);

getch();
return 0;
}
A voir également:

4 réponses

loupius
 
Votre programme est illisible!
Au lieu de:

void supprime_repitition(char txt[])
{int i,j,n,l;
l=strlen(txt);
for(i=0;i<l;i++)
{printf("%d\n",strcmp((txt+i),(txt+i+1)));
if(strcmp((txt+i),(txt+i+1))==NULL)
{for(j=i;j<l;j++)txt[j]=txt[j+1];}
}
printf("%s %d",txt,strlen(txt));

}

écrivez
void supprime_repitition (char txt[])
{
  int i, j, n, l;
  l = strlen (txt);
  for (i=0; i<l; i++)
  {
    printf ("%d\n", strcmp ((txt+i), (txt+i+1)));
    if (strcmp ((txt+i), (txt+i+1)) == NULL)
    {
        for (j=i; j<l; j++)
          txt[j] = txt[j+1];
    }
  }
  printf ("%s %d", txt,strlen(txt));
}

C'est quand même plus lisible, isn't ?

- strcmp ne renvoie pas un pointeur, mais un entier (donc ne pas utiliser NULL qui est plutôt réservé aux pointeur), mais le compilateur l'accepte, ce n'est qu'une question de convention d'écriture.
Au lieu de:
for (j=i; j<l; j++)

essayez plutôt:
for (j=i+1; j<l; j++)

car il faut sauter un caractère.
0
tariktrk Messages postés 46 Date d'inscription   Statut Membre Dernière intervention   12
 
si j'ai bien compris ma fonction sera comme ca mais ca ne marche pas encore domage

void supprime_repitition (char txt[])
{
int i, j, n, l;
l = strlen (txt);
for (i=0; i<l; i++)
{

if (strcmp ((txt+i), (txt+i+1)) == 0)
{
for (j=i+1; j<l; j++)
txt[j] = txt[j+1];
}
}
printf ("%s %d", txt,strlen(txt));

}
0
loupius
 
Ca marche pas, c'est un peu court comme réponse; en clair que se passe-t-il?
Ca plante? Ca ne fait pas ce qui est attendu? Dans ce cas qu'est-ce qui s'affiche?
0
tariktrk Messages postés 46 Date d'inscription   Statut Membre Dernière intervention   12
 
oui vous avez raisons dsl
alors il me affiche tout simplement se que j'entrai avec la longueur de txt

exemple apres compilation

entrez une texte(de -49 50 caractère exécuter
rezzrtttezz
rezzrtttezz
rezzrtttezz 11
0
loupius
 
L'erreur vient de l'utilisation de 'strcmp' qui compare des chaînes et ce n'est pas ce que l'on veut; on veut simplement comparer deux caractères.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void supprime_repetition (char txt[])
{
  int i, j;
  for (i=0; i<strlen(txt); i++)
  {
    if (txt[i] == txt[i+1])
    {
      for (j=i; j<strlen(txt); j++)
        txt[j] = txt[j+1];
    }
  }
  printf ("%s %d", txt,strlen(txt));
}

main()
{
  char txt[50];
  printf("entrez une texte (de -49 caractères\n");
  gets(txt);
  printf("%s\n",txt);

  supprime_repetition(txt);

  return 0;
}
0
tariktrk Messages postés 46 Date d'inscription   Statut Membre Dernière intervention   12
 
oui exactement j ai un problème dans les accolade ainsi que la fonction strcmp ainsi il faut un petit i--;
car si je lui donne 3 de même caractère il efface seulement 1 et il laisse les deux donc il dois toujours retourner a la au la valeur de i qui était la cause chaque fois il entre dans la boucle if
voila c fais et mon dernier mots c
N.B je ne sais si j ai bien fais comprendre le message mais ca c est le programme
#include <stdio.h>
#include <conio.h>
#include <string.h>

int supprime_repetition (char txt[])
{int i, j;
for (i=0; i<strlen(txt); i++)
{if (txt[i] == txt[i+1])
{for (j=i; j<strlen(txt); j++)
{txt[j] = txt[j+1];}
i--;}}
return i;
}
main()
{char txt[50];
printf("entrez une texte (de -50 caractères)\n");
gets(txt);
printf("%s %d\n",txt,supprime_repetition(txt));
getch();
return 0;
}
dans tout les cas merci beaucoup loupius pour votre aide et si vous vouliez me contacter et je souhaite le faire pour vous dire merci mon email c : tariktrk@hotmail.com
0