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 -
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 !!
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:
- Programme c qui supprime les répétitions de caractére identique
- Caractère ascii - Guide
- Caractère spéciaux - Guide
- Recuperer message whatsapp supprimé - Guide
- Caractere speciaux - Guide
- Message supprimé whatsapp - Guide
3 réponses
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.
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.
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
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
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 :))
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 :))
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>
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>
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).
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).
@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
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
Ceci devrait t'inspirer:
Gates gave ^W sold you the windows.
GNU gave us the whole house.(Alexandrin)
#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)
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.
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.
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 ?
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 ?
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.
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.
@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
Dal
Dal