IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

programme qui calcule le nombre de caractères d'une chaîne


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 90
    Points : 47
    Points
    47
    Par défaut programme qui calcule le nombre de caractères d'une chaîne
    Bonsoir à tous,
    J'ai réussi à rendre les premiers devoir ; la suite , il y a un truc, où je vais avoir besoin de votre aide.
    Voilà le programme que je dois écrire: doit demander la saisie d'une chaîne de caractère, et affiche ensuite le nombre de caractère.
    Alors voilà,, j'ai réussi à écrire un prgramme mais il ne fait pas ce que j'ai envi. Je voudrai qu'il additionne le nombre de caractère séparé par un espace.
    Voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #include<stdio.h>
    #include<stdlib.h>
    int longueurChaine(const char* chaine);
     
    int main()
    {
        char chaine[]="\0";
        int longueur = 0;
     
     
        printf("Veuillez saisir une chaine de caractère chaine\n");
        scanf("%s",chaine);
        longueur = longueurChaine(chaine);
        printf("\nLa chaine %s fait %d caracteres de long", chaine, longueur);
     
     
        return 0;
    }
     
    int longueurChaine(const char* chaine)
    {
        int nombreDeCaracteres = 0;
        char i;
        char caractereActuel = 0;
     
        do
        {
            caractereActuel = chaine[nombreDeCaracteres];
            nombreDeCaracteres++;
     
        }
        while(caractereActuel != '\0'); // On boucle tant qu'on n'est pas arrivé à l'\0
     
        //if (caractereActuel=' ' )nombreDeCaracteres++;
     
     
     
     
        nombreDeCaracteres--; // On retire 1 caractère de long pour ne pas compter le caractère \0
     
        return nombreDeCaracteres;
    }
    Je vous remercie de l'aide que vous pourrez m'apporter.
    Bonne soirée

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Ton tableau ne contiendra qu'un seul élément quoi qu'il arrive.

    Si tu veux faire un buffer, il faudra utiliser un tableau d'une taille prédéfinie :
    Si par la suite tu veux redimensionner ton tableau, il faudra d'abord l'alloué dynamiquement avec malloc et le redimensionner avec realloc.

  3. #3
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Bonjour,

    Le problème, c'est que vous utilisez scanf pour faire la saisie au clavier. Hors avec le format %s, scanf s'arrête sur le premier espace.

    Je vous conseillerai plutôt d'utiliser la fonction fgets pour la saisie d'une chaine de caractères avec des espaces.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char saisie[128] = "" ;
     
    if(fgets(saisie, 128, stdin)==NULL) {
        printf("Erreur dans la saisie.\n") ;
        return EXIT_FAILURE ;
    }
    printf("%s", saisie) ;
    La particularité de cette fonction, c'est aussi d'éviter les dépassements de buffer (buffer overflow detected). Par contre, le code de retour chariot est stocké dans la chaine ("Test de saisie\n").

    stdin représente le file descriptor du clavier.

    Bonne continuation.
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    int longueurChaine(const char* chaine)
    {
        int nombreDeCaracteres = 0;
        char i;
        char caractereActuel = 0;
     
        do
        {
            caractereActuel = chaine[nombreDeCaracteres];
            nombreDeCaracteres++;
     
        }
        while(caractereActuel != '\0'); // On boucle tant qu'on n'est pas arrivé à l'\0
     
        //if (caractereActuel=' ' )nombreDeCaracteres++;
     
     
     
     
        nombreDeCaracteres--; // On retire 1 caractère de long pour ne pas compter le caractère \0
     
        return nombreDeCaracteres;
    }
    Cette fonction pourrait être améliorée (outre le fait qu'elle fait la même chose que strlen(), mais je pense que c'est un exercice et qu'il ne faut donc pas l'utiliser )
    • S'il faut systématiquement décrémenter nombreDeCaracteres à la fin, pourquoi ne pas l'initialiser à -1 au lieu de 0 ? On pourrait aussi utiliser un while et non un do/while.
    • Le caractère de tampon caractereActuel n'est pas nécessaire.

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 90
    Points : 47
    Points
    47
    Par défaut
    Déjà merci pour votre guidage dans mon problème. J'ai pris en compte vos remarques pour mettre au point mon programme. Alors j'ai réussi à le compiler, mais il comporte des erreurs: j'ai l'impression que cette fois le programme compte les espaces et le dernier caractère \0.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #include<stdio.h>
    #include<stdlib.h>
    int longueurChaine(const char* saisie);
     
    int main()
    {
        int longueur = 0;
        char saisie[128] = "" ;
        printf("Veuillez saisir une chaine de caractère chaine\n");
        if(fgets(saisie, 128, stdin)==NULL)
        {
            printf("Erreur dans la saisie.\n") ;
            return EXIT_FAILURE ;
        }
        printf("%s", saisie) ;
        longueur = longueurChaine(saisie);
        printf("\nLa chaine %s fait %d caracteres de long", saisie, longueur);
        return 0;
    }
     
    int longueurChaine(const char* saisie)
    {
        int nombreDeCaracteres = 0;
        char caractereActuel = 0;
     
        do
        {
            caractereActuel = saisie[nombreDeCaracteres];
            nombreDeCaracteres++;
     
        }
        while(caractereActuel != '\0'); // On boucle tant qu'on n'est pas arrivé à l'\0
        if(caractereActuel==' ')nombreDeCaracteres--;
     
        nombreDeCaracteres--;     // On retire 1 caractère de long pour ne pas compter le caractère \0
     
        return nombreDeCaracteres;
    }
    Citation Envoyé par Bktero
    mais je pense que c'est un exercice et qu'il ne faut donc pas l'utiliser
    C'est exacte, c'est pour la seconde partie de l'exercice la fonction strlen.

    Citation Envoyé par Bktero
    S'il faut systématiquement décrémenter nombreDeCaracteres à la fin, pourquoi ne pas l'initialiser à -1 au lieu de 0 ? On pourrait aussi utiliser un while et non un do/while.
    Oui je comprend l'idée, mais je n'arrive pas à coder en utilisant juste un while.

    Merci encore de votre aide

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    do
        {
            caractereActuel = saisie[nombreDeCaracteres];
            nombreDeCaracteres++;
     
        }
        while(caractereActuel != '\0'); //tant que caractère actuel est différent de 0 on boucle. Quand on sort de la boucle caractereActuel vaut donc 0.
        if(caractereActuel==' ')nombreDeCaracteres--;
    //si caractèreActuel == ' '
    Tu ne penses pas qu'il y a un léger problème?
    De plus à quoi te sert d'utiliser la variable caractereActuel ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    while(saisie[nombreDeCaracteres]) nombreDeCaracteres++;
    if(nombreDeCaracteres && saisie[nombreDeCaracteres-1] == ' ') nombreDeCaracteres--;

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 90
    Points : 47
    Points
    47
    Par défaut
    c'est exact, la variable caractereActuel ne sert à rien. Du coup j'ai modifié la source en retirant cette variable et en ajoutant la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if((nombreDeCaracteres && saisie[nombreDeCaracteres-1] )== ' ') nombreDeCaracteres--;
    en pensant que le petit programme allait me soustraire le nombre d'espace du nombreDeCaractere. Bah non, arf !!!
    Voici ma source
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #include<stdio.h>
    #include<stdlib.h>
    int longueurChaine(const char* saisie);
     
    int main()
    {
        int longueur = 0;
        char saisie[128] = "" ;
        printf("Veuillez saisir une chaine de caractère chaine\n");
        if(fgets(saisie, 128, stdin)==NULL)
        {
            printf("Erreur dans la saisie.\n") ;
            return EXIT_FAILURE ;
        }
        longueur = longueurChaine(saisie);
        printf("\nLa chaine %s fait %d caracteres de long", saisie, longueur);
        return 0;
    }
     
    int longueurChaine(const char* saisie)
    {
        int nombreDeCaracteres = 0;
     
       while(saisie[nombreDeCaracteres]) nombreDeCaracteres++;
      if((nombreDeCaracteres && saisie[nombreDeCaracteres-1] )== ' ') nombreDeCaracteres--;
     
        nombreDeCaracteres--;     // On retire 1 caractère de long pour ne pas compter le caractère \0
     
        return nombreDeCaracteres;
    }
    Quelle astuce pouvez-vous me donner pour résoudre mon problème ? Merci

  8. #8
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 559
    Points
    1 559
    Par défaut
    Pose-toi les questions suivantes:
    - à quel moment vais-je sortir de ma boucle while?
    - quels caractères aurais-je 'vu' (et donc comptés) en faisant ma boucle? (écris éventuellement une chaine de caractère sur un papier, et parcours-la)
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 90
    Points : 47
    Points
    47
    Par défaut
    Merci Edgarjacob,
    - à quel moment vais-je sortir de ma boucle while?
    Je veux sortir de ma boucle dès que l'on tombe sur le caractère de fin de chaine \0.

    quels caractères aurais-je 'vu' (et donc comptés) en faisant ma boucle?
    Lorsque je parcourt ma chaîne, je compte des espaces, j'ai donc ajouté une condition si l'on rencontre un espace, on décrémente le nombre de caractère.


    mes modof sur ma source.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     while(saisie[nombreDeCaracteres]!='\0') nombreDeCaracteres++;
      if(saisie[nombreDeCaracteres]== ' ') nombreDeCaracteres--;
     
        nombreDeCaracteres--;
    En gros, le programme continue à me compter les espaces. N'ai je pas placer ma condition au mauvais endroit ?

  10. #10
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Voici ce que tu as fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while(saisie[nombreDeCaracteres])
    {
         nombreDeCaracteres++;
    }
    if(saisie[nombreDeCaracteres]== ' ') nombreDeCaracteres--; //tu ne retire pas rien vu que le dernier caractère est '\0'
     
    nombreDeCaracteres--; //inutile, essaye de voir ce que fait ta boucle pour comprendre.
    Tu dois mettre ton if à l'intérieur de ta boucle.

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Tu as deux problèmes majeurs.

    Le premier est que tu maitrises mal les structures de contrôle que tu utilises. Tu n'arrives pas à mettre un while à la place d'un do / while, tu ne sembles pas savoir comment fonctionne le while si tu ne mets pas d'accolades (voir message de Neckara juste au dessus). C'est compréhensible si tu es débutant, mais cela veut dire qu'il faut revoir ton cours sur les structures de contrôle.

    Le second est que ton algorithme est mauvais, au moins il est mal structuré. Il faut écrire ses algo en français avant de les écrire en C. Dans ton cas, ça donne à peu près :
    • TANT QUE( caractère courant != 0 )
    • SI caractère courant n'est pas un espace, j'incrémente mon compteur
    • SINON, rien
    • Caractère courant = caractère suivant
    • FIN de la boucle

    Quand c'est bien écrit en français, c'est d'autant plus facile de la faire en C. La logique veut que tu comptes que si ce n'est pas un espace et non de compter toujours et de décrémenter si c'est un espace.

    Voici le squelette (et presque la peau avec) de ta fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    unsigned int compter_carac(char *str)
    {
        unsigned int nb = 0;
     
        while( *(str) != 0 )
        {
            if( ... ) // si ce n'est pas un espace
                nb++;
            else
                ...
     
            ... // passer au caractere suivant ? et si on incrementait le pointeur ?
        }
     
        return nb;
    }

  12. #12
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 90
    Points : 47
    Points
    47
    Par défaut
    merci Bktero pour ce beau squelette, à la limite de la peau de bête. , Mon programme fait du mieux, mais il ne sait plus compter au delà de 2 espaces. Pourquoi, qu'est ce que je lui ai dit de mauvais ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #include<stdio.h>
    #include<stdlib.h>
    unsigned int compter_carac(char *str);
    int main()
    {
        int longueur = 0;
        char str[128] = "" ;
        printf("Veuillez saisir une chaine de caractère chaine\n");
        if(fgets(str, 128, stdin)==NULL)
        {
            printf("Erreur dans la saisie.\n") ;
            return EXIT_FAILURE ;
        }
     
        longueur = compter_carac(str);
        printf("\nLa chaine %s fait %d caracteres de long", str, longueur);
        return 0;
    }
     
     
     
     
     
    unsigned int compter_carac(char *str)
    {
        unsigned int nb = 0;
     
        while( *(str) != '\0' )
        {
            if(*(str)!=' ' ) // si ce n'est pas un espace
                nb++;
            else
                nb--;
     
            *str++;
        }
     
        return nb;
    }

  13. #13
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(*(str)!=' ' ) // si ce n'est pas un espace
                nb++;
            else
                nb--;
    Pourquoi faire nb-- ?
    Tu comptes tous les caractères qui ne sont pas des espaces, tu ne comptes pas :
    NbCaractèreNonEspace - NbCaractèreEspace.

  14. #14
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bien tenté, mais l'étoile est de trop ici.

    Tu as lu trop vite ou as codé trop vite ce que j'avais dit :
    SI caractère courant n'est pas un espace, j'incrémente mon compteur
    SINON, rien

  15. #15
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 90
    Points : 47
    Points
    47
    Par défaut
    Yeah, trop cool, mon programme fonctionne. Génial, Merci encore à vous

  16. #16
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    De rien

    Pense à cliquer sur le bouton !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 12/12/2010, 23h09
  2. un programme qui calcule le nombre des mots
    Par komat dans le forum Débuter
    Réponses: 3
    Dernier message: 06/12/2010, 22h46
  3. Réponses: 10
    Dernier message: 31/12/2006, 12h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo