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 :

problème char-actéristique avec des pointeurs


Sujet :

C

  1. #1
    Membre du Club Avatar de Antigonos Ier Gonatas
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 78
    Points : 40
    Points
    40
    Par défaut problème char-actéristique avec des pointeurs
    Bonjour tout le monde!
    Alors voilà, j'ai re-recommencé le C, et en apprenant, j'aimerais pouvoir refaire
    le même genre de programmes que ceux des exercices de Gérard Swinnen
    dans son cours de python.

    Arrivé aux chars, j'aimerais faire un programme comptant le nombre d'occurences
    d'une lettre choisi par l'utilisater dans une phrase écrite par ses soins.

    J'ai déja fait du code, le débugger ne détecte rien (je suis sous Dev-C++, Code:Blocks ne voulant pas me créer un fichier source compilable sans
    faire un projet au préalable, et ne mettant pas le system("pause"); automatiquement lors de la compilation de mes programmes.

    donc, tout semble aller bien.


    Pourtant, deux erreurs surviennent:

    1.le programme ne réagit pas après le premier scanf(), je suis obliger de rentrer un nombre ou une lettre pour continuer le programme.

    2.après avoir affiché ce que l'utilisateur a écrit à l'écran,le programme se termine, sans demander son reste.


    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
    // Lettrecteur version 0.1
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char **argv)
    {
        char phrase[100];
        char lettre=0;
        char i=0;
        int chaine= *phrase;
        int compte=0;
     
     
        printf("bonjour, bienvenue dans le programme Lettrecteur!\n");
        printf("Ce programme comptera le nombre d'occurence\n");
        printf("d'une lettre que vous aurez choisi dans une phrase\n\n\n\n");
     
        printf("Veuillez ecrire une phrase:\n");
        scanf("%s",&phrase);
        printf("Votre phrase est:\n");
        printf("%s",phrase);
     
        printf("Maintenant,veuillez taper une lettre a retenir:\n");
        scanf("%c",&lettre);
     
        for(i=0 ; i<chaine;i++)
        {
                if(i==lettre)
                {
                             compte++;
                }
        }
        system("pause");
        return 0;
    }

    Voilà, si quelqu'un a une idée sur les origines de ces erreurs, je suis preneur!

  2. #2
    Membre du Club Avatar de Antigonos Ier Gonatas
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 78
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par Gruik

    L'entier "phrase" ne peut pas accueillir tous les caracteres qui risquent d'etre ecrits et ça n'a aucun sens de stoquer les caracteres d'une chaine dans un entier. -> un compilateur bien configuré t'aurais averti


    ... printf va prendre l'entier "phrase" pour une adresse et essayer de lire la chaine située à cette "adresse" -> comportement indeterminé. idem, un compilateur bien configuré t'aurais averti.

    Pour la première remarque, euh, oui, le char est trop petit pour tout stocker?
    Et si l'on ne stocke pas les caractère dans un tableau, comment s'y prendre alors?


    Pour la deuxième remarque,oui, je voulais que phrase soit lue du début à la fin pour pouvoir ensuite comparer dans une boucle si il y avait en effet la lettre définie par l'utilisateur, et combien de fois, tiens, d'ailleurs, je crois que mon code est incomplet pour ça...

    Tu n'aurais pas une astuce pour règler ce genre de problème?

    merci.

  3. #3
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Nan j'ai rien dit, scuz moi

    Pour ta boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0 ; i<chaine;i++)
    "chaine" vaut une valeur indeterminée
    Car à l'initialisation, tu lui affectais une valeur non initialisée

    => le premier caractere de phrase n'est pas initialisé

    Du coup, "chaine" peut valoir -128 à 127. Si il vaut -4, tu sors tout de suite de la boucle
    Un moyen de parcourir une chaine (sans strlen) est de s'arreter qd on trouve le caractere \0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        for(i=0 ; phrase[i] != '\0';i++)
        {
                if(phrase[i]==lettre)
                {
                             compte++;
                }
        }
    Tu pouvais aussi utiliser une boucle à base de strchr()

  4. #4
    Membre du Club Avatar de Antigonos Ier Gonatas
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 78
    Points : 40
    Points
    40
    Par défaut ah mais C bien sùr!
    Donc, si j'ai bien compris, ma variable "chaine", je dois la définir plus loin vu qu'au début du programme, on ne sait pas encore combien de caractère a phrase, et tu me dis aussi que la valeur que chaine prend est celle du premier terme...

    Ce que je suis bête moi!

    Ta technique avec le for a l'air plus efficace et moins casse tête en effet.

    Et ensuite, plus qu'un printf à rajouter en fin de code et la boucle est bouclée!

    Corrige moi si je me trompe.En tout cas, merci pour ton aide!

    Prochaine étape, écrire un texte à l'envers!
    et puis ensuite, pourquoi pas un programme de traduction de tes phrases en morses!

    Ah oui, j'oubliais,vu que je veux qu'il retienne une phrase, comment je fait pour ne pas que le compilo me la coupe dés qu'il tombe sr un espace?

  5. #5
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Citation Envoyé par Antigonos Ier Gonatas
    Donc, si j'ai bien compris, ma variable "chaine", je dois la définir plus loin vu qu'au début du programme, on ne sait pas encore combien de caractère a phrase, et tu me dis aussi que la valeur que chaine prend est celle du premier terme...
    C'est bien ça. Tu as affecté à "chaine" la valeur du premier caractere se trouvant dans ton tableau de char.

    Ce que je suis bête moi!

    Ta technique avec le for a l'air plus efficace et moins casse tête en effet.

    Et ensuite, plus qu'un printf à rajouter en fin de code et la boucle est bouclée!

    Corrige moi si je me trompe.En tout cas, merci pour ton aide!

    Prochaine étape, écrire un texte à l'envers!
    et puis ensuite, pourquoi pas un programme de traduction de tes phrases en morses!

    Ah oui, j'oubliais,vu que je veux qu'il retienne une phrase, comment je fait pour ne pas que le compilo me la coupe dés qu'il tombe sr un espace?
    Je connais pas bien scanf, peut etre que c'est possible avec scanf.
    Il est temps de passer à fgets ( http://man.developpez.com/man3/fgets.3.php ).

  6. #6
    Membre du Club Avatar de Antigonos Ier Gonatas
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 78
    Points : 40
    Points
    40
    Par défaut
    ah tiens, intéressant ce lien!

    EOF !!!!

    Wouah, OEF, j'ai déja vu ça dans les pages du livre "Le Langage C", peut-être que je devrais le lire finalement au lieu de me contenter des cours.
    Mais il avait l'air assez austère...enfin bon, c'est une bonne lecture ou une lecture indispensable à ton avis?

    Et puis pour ce genre de lien que tu m'as mis, les autres sont tous dans la section linux?

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Antigonos Ier Gonatas
    Arrivé aux chars, j'aimerais faire un programme comptant le nombre d'occurences
    d'une lettre choisi par l'utilisater dans une phrase écrite par ses soins.

    J'ai déja fait du code, le débugger ne détecte rien
    Déjà, il faudrait corriger ça :
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `main':
    main.c:15: warning: char format, different type arg (arg 2)
    main.c: At top level:
    main.c:4: warning: unused parameter 'argc'
    main.c:4: warning: unused parameter 'argv'
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 3 seconds)
    0 errors, 3 warnings
    Ensuite, il faut savoir que scanf() est une fonction difficile à utiliser correctement. Je recommande l'usage maitrisé de fgets(). Bien lire la doc. (Le \n est saisi, mais il y a des moyens propres de le supprimer. C'est un problème évoqué au moins une fois par jour sur les forums C, Voir la FAQ).

    Au fait, scanf() avec "%s" ne prend pas de phrases, mais un mot, car l'espace est le séparateur de champs.

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

    Tout lire... Poser des questions, expérimenter... Les saisies en C, c'est un vrai problème... Il mérite attention et pratique...
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Antigonos Ier Gonatas
    Mais il avait l'air assez austère...enfin bon, c'est une bonne lecture ou une lecture indispensable à ton avis?
    Toute lecture est bonne à prendre Et je suis de l'avis de Gruik, il est préférable d'utiliser fgets !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  9. #9
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Citation Envoyé par Antigonos Ier Gonatas
    ah tiens, intéressant ce lien!

    EOF !!!!

    Wouah, OEF, j'ai déja vu ça dans les pages du livre "Le Langage C", peut-être que je devrais le lire finalement au lieu de me contenter des cours.
    Mais il avait l'air assez austère...enfin bon, c'est une bonne lecture ou une lecture indispensable à ton avis?

    Et puis pour ce genre de lien que tu m'as mis, les autres sont tous dans la section linux?
    Je connais rien en livre, mais si il s'agit du fameux "K&R", oui c'est à lire.

    Pour le lien que j'ai donné, c'est une page du "man", aucun programmeur C ne peut se passer du man (ou d'une reference equivalente).. il s'agit en gros du manuel d'utilisation des systemes unix fourni de base avec tout systeme unix. Il est divisé en sections, la section concernant les fonctions de la librairie standard du C est la "3"
    Donc qd tu veux "la vraie doc" sur une fonction du C => http://man.developpez.com/ et choisis la section "3" ("2" peut être utile aussi, ca concerne les appels systeme bas niveau).

  10. #10
    Membre du Club Avatar de Antigonos Ier Gonatas
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 78
    Points : 40
    Points
    40
    Par défaut
    Merci pour vos conseils , ça devrait m'apprendre à coder proprement et à mieux savoir ce que je fait au lieu de copier avec deux ou trois instructions difficiles et mal appropriées.

    Emmanuel Delahaye et Gruik, je conclus de vos propos que le compilo de Dev-C++ est vraiment m**dique, ça m'encourage donc à revenir sur Code:Blocks et à prendre le compilo linux (c'est bien ça GCC nan?) pour coder.

    Toute lecture est bonne à prendre
    Si tu le dis, je vais donc m'intéresser de plus près à ce bouquin et pas lui laisser prendre la poussière.

    Bon, eh bien, y'a de la lecture qui m'attends moi!

    merci à tous et au revoir!

  11. #11
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Citation Envoyé par Antigonos Ier Gonatas
    Emmanuel Delahaye et Gruik, je conclus de vos propos que le compilo de Dev-C++ est vraiment m**dique, ça m'encourage donc à revenir sur Code:Blocks et à prendre le compilo linux (c'est bien ça GCC nan?) pour coder.
    Code::Blocks contient MingW, le portage gcc pour windows, donc non c'est juste que tu n'as pas su trouver où configurer les options de compilation de ton projet. "man gcc" pour avoir la liste complete des options (bon je le conseille pas au debut, c'est trop lourd pour être lu comme ça).. des flags courants sont "-Wall -W". Une chose à prendre en consideration est aussi "quel standard tu souhaites adopter", si tu souhaites etre le plus standard possible afin d'etre portable au maximum, ou alors profiter des fonctionnalités bien pratique mais pas standardisées.

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Antigonos Ier Gonatas
    Emmanuel Delahaye et Gruik, je conclus de vos propos que le compilo de Dev-C++ est vraiment m**dique, ça m'encourage donc à revenir sur Code:Blocks et à prendre le compilo linux (c'est bien ça GCC nan?) pour coder.
    Quetu prennes gcc, Dev-C++ ou Code::Blocks, le compilateur est le même. Ce qu'il faut, c'est apprendre à le configurer correctement :

    http://emmanuel-delahaye.developpez....tm#cfg_compilo

    Si tu le dis, je vais donc m'intéresser de plus près à ce bouquin et pas lui laisser prendre la poussière.
    C'est un excellent livre de référence qui explique tout en détail, mais pas dans un langage 'débutant'.
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. Probléme de pointeur avec des pointeurs de char *
    Par marime dans le forum Débuter
    Réponses: 4
    Dernier message: 30/09/2013, 13h14
  2. problème de fonction avec des pointeurs
    Par bl4cksky dans le forum Débuter
    Réponses: 16
    Dernier message: 09/09/2013, 12h28
  3. Soucis avec des pointeurs, des tableaux, des char*
    Par isabell3 dans le forum Débuter
    Réponses: 2
    Dernier message: 07/12/2009, 12h00
  4. Problème avec des pointeurs
    Par Darick dans le forum C
    Réponses: 4
    Dernier message: 15/05/2008, 09h43
  5. Problème de buffer avec des int et des char
    Par Lolita59 dans le forum Réseau
    Réponses: 23
    Dernier message: 04/05/2006, 11h09

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