Exercices sur les chaines de caractères

Fermé
Aureche Messages postés 2 Date d'inscription mercredi 17 mars 2021 Statut Membre Dernière intervention 18 mars 2021 - Modifié le 17 mars 2021 à 09:07
Aureche Messages postés 2 Date d'inscription mercredi 17 mars 2021 Statut Membre Dernière intervention 18 mars 2021 - 18 mars 2021 à 12:01
Bonjour,

Je suis un étudiant débutant la programmation en C, j'ai ici un exercice sur lequel je bloque depuis plusieurs heures et pas moyen de trouver ce qui ne vas pas, pourriez vous m'aider?

voici l'enoncé


Et voici mon code:

#include <stdio.h>
#include <stdlib.h>

void fcompactage(char*,char*, int);

int main()
{
    char nom[15];
    int a;

    printf("Encodez un nom: ");
    gets(&nom[0]);
    puts(&nom[0]);
    fcompactage(&nom[0],&nom[1], 15);
    puts(&nom[0]);
}

void fcompactage(char *pnom, char *pnom2, int nbmax)
{
        int a,b,c;

        while(*pnom!=0)
        {
            a=*pnom;
            c=0;
            while(*pnom==*pnom2)
            {
                a=49;
                pnom2++;
                c++;
            }


*pnom=a+c;
            pnom2++;
            pnom+c;
            pnom++;
        }

Si vous pouviez m'amener sur la bonne voie afin que je puisse réussir cet exercice cela serait très aimable.

Merci d'avance :)

EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).
Explications disponibles ici :
https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

Merci d'y penser dans tes prochains messages.

2 réponses

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
17 mars 2021 à 08:44
Bonjour,

Attention, pour poster du code il faut utiliser les balises (le bouton [<>]) sinon il devient difficile à lire.
D'autre part, si tu indiquais ce que tu obtiens ça serait plus facile pour nous (une erreur de compilation, un plantage à l'exécution, un mauvais résultat dans certains cas, ...)

Ton algorithme est plutôt pas mal, tu gères tout dans un unique buffer et arrives à gérer presque tout de manière unique y compris les cas où une lettre est là une seule ou plusieurs fois.

Si je prends tes 4 dernières lignes:
*pnom=a+c;
pas mal l'astuce, ça gère les 2 cas.
pnom2++;
pas mal aussi ce replacement.
pnom+c;
Vois-tu pourquoi cette ligne n'a aucun sens?
pnom++;
Là ça n'est pas aussi simple.

Pour comprendre le problème il te faut faut faire un dessin et applique la procédure à la main. Tu verras qu'avoir 2 pointeurs pnom et pnom2 n'est pas suffisant. Il te faut :
-
pnom_lit
: le pointeur qui lit la chaîne
-
pnom_lit2
: le pointeur juste après qui recherche les caractères en double.
-
pnom_ecrit
: le pointeur qui écrit le résultat. au début il est égal à
pnom_lit
mais il avance moins vite que
pnom_lit
.

Et n'oublie pas de mettre un terminateur de chaîne à ton résultat.
0
Aureche Messages postés 2 Date d'inscription mercredi 17 mars 2021 Statut Membre Dernière intervention 18 mars 2021
18 mars 2021 à 12:01
Pardonnez moi, je ferai attention la prochaine fois.

Merci de votre aide, j'ai compris ou était mon erreur grâce à vous :)
0