Supprimer la répétition une chainedecaractère

Résolu
tariktrk Messages postés 50 Statut Membre -  
tariktrk Messages postés 50 Statut Membre -
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;
}
Configuration: Windows XP
Firefox 3.0.4

4 réponses

  1. 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
  2. tariktrk Messages postés 50 Statut Membre 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
    1. 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
  3. tariktrk Messages postés 50 Statut Membre 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
    1. 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
  4. tariktrk Messages postés 50 Statut Membre 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