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 avec boucle


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mai 2008
    Messages : 45
    Par défaut Problème avec boucle
    Bonjour,
    je voulais faire un petit programme qui attend la saisie d'un caractère, tant qu'on a pas entré 10 caractères.
    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
    #include <stdio.h>
     
    int main()
    {
    	int	i=0;
    	char	car = ' ';
     
    	do
    	{
    		car = getchar ();
    		i ++;
    	}
    	while (i != 10);
    getchar();
    return 0;
    }
    mais après que je tape 6 caractères je sort de la boucle ..
    où est le problème ? Est ce qu'il compte aussi l'Entrée que je tape ?
    Merci d'avance ..

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Kai,

    Oui, TOUS les caractères entrés sont pris en compte.

  3. #3
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mai 2008
    Messages : 45
    Par défaut
    Bonjour,
    je fais comment alors ?

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Mei,
    Citation Envoyé par Elaich Voir le message
    Bonjour,
    je fais comment alors ?
    A toi d'intercepter les caractères que tu ne veux pas prendre en compte (en clair, ne pas incrémenter ton compteur i si tu ne veux pas d'un caractère).

  5. #5
    Membre averti

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 28
    Par défaut
    En gros là, le caractère que tu souhaites ne pas intercepter et la celui inscrit quand tu presse la touche Enter. En ascii il équivaut au nombre 10.
    Donc il te suffit de rajouter une condition avant d'incrémenter.
    Elle sera la suivante: Si la valeur numérique du caractère intercepté est différente de 10 j'incrémente.
    En code ça se traduit comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if((int)car!=10)
             i++;
    Cependant ce code n'est valide que si ton invité de commande travail avec le codage ASCII, car sinon la valeur 10 peut représenter un tout autre caractère.

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Gae,
    Citation Envoyé par Grifos Voir le message
    En gros là, le caractère que tu souhaites ne pas intercepter et la celui inscrit quand tu presse la touche Enter. En ascii il équivaut au nombre 10.
    Donc il te suffit de rajouter une condition avant d'incrémenter.
    Elle sera la suivante: Si la valeur numérique du caractère intercepté est différente de 10 j'incrémente.
    En code ça se traduit comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if((int)car!=10)
             i++;
    Cependant ce code n'est valide que si ton invité de commande travail avec le codage ASCII, car sinon la valeur 10 peut représenter un tout autre caractère.
    Non, il s'agit de CR (Carriage Return), code = 13, et non de LF (Line Feed), code = 10


  7. #7
    Membre averti

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 28
    Par défaut
    Hum, ça m'étonne, je ne contredis pas ce que tu dis vu que ça doit être vrai, cependant j'ai trouvé ce nombre 10 simplement en affichant chaque caractère pressé dans la console et enter correspondait a 10... De plus en reprenant le programme de Elaich et en mettant cette condition ça fonctionnais bien, tandis que lorsque je prend le 13 ça ne marche pas...

  8. #8
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Le(s) caractère(s) de fin de ligne dépend(ent) du système d'exploitation utilisé. '\n' est, pour le C, l'indication d'une fin de ligne

  9. #9
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Jai,
    Citation Envoyé par Grifos Voir le message
    Hum, ça m'étonne, je ne contredis pas ce que tu dis vu que ça doit être vrai, cependant j'ai trouvé ce nombre 10 simplement en affichant chaque caractère pressé dans la console et enter correspondait a 10... De plus en reprenant le programme de Elaich et en mettant cette condition ça fonctionnais bien, tandis que lorsque je prend le 13 ça ne marche pas...
    Tu as raison, et là, j'en suis fort étonné.

    Il est vrai que je ne me suis jamais posé la question pour le C, car je ne fais jamais d'application console, mais j'ai programmé pendant des années en Pascal et en Assembleur, et Enter = 13, ce que je viens de vérifier à l'instant.

    Bigre, belle différence d'interprétation !!

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Lors d'une lecture d'un flux texte en C, seul le LF apparait, c'est dicté par le standard.

    Lorsqu'on écrit dans un fichier en mode texte, le LF sera automatiquement convertit en marqueur de fin de ligne du système d'exploitation (CRLF pour Windows, CR pour MaxOS<=9, LF pour unixoïdes).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Mai 2008
    Messages : 45
    Par défaut
    Bonjour,
    On sait bien qu'après chaque caractère que je tape, il faut que je tape entrée après, pourquoi mettre if si on connait que la condition est vrai après chaque caractère que je tape ?
    l'idée que j'ai eu c'est d'ajouter un getchar() pour entrée :
    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
    #include <stdio.h>
     
    int main()
    {
            int     i=1;
            char    car = ' ';
     
            do
            {
                    car = getchar ();
                    getchar ();
                    i ++;
            }
            while (i != 10);
    getchar();
    return 0;
    }

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Elaich Voir le message
    je voulais faire un petit programme qui attend la saisie d'un caractère, tant qu'on a pas entré 10 caractères.
    On ne sait pas faire ça en C standard.
    <...>
    mais après que je tape 6 caractères je sort de la boucle ..
    où est le problème ? Est ce qu'il compte aussi l'Entrée que je tape ?
    Ce code n'est pas portable Il faut utiliser '\n' et rien d'autre.

    Tu devrais étudier les comportement de getchar () (fgetc(stdin)) qui ne fait pas du tout ce que tu crois :

    http://emmanuel-delahaye.developpez.com/notes.htm#fgetc

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

Discussions similaires

  1. [batch] problème avec boucle for
    Par TanEk dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 22/04/2008, 14h41
  2. Problème avec boucle
    Par tahoser dans le forum MATLAB
    Réponses: 6
    Dernier message: 04/01/2008, 09h59
  3. Problème avec boucle for() et action POST
    Par Oli_Ifre dans le forum Langage
    Réponses: 4
    Dernier message: 26/04/2007, 09h52
  4. [ActionScript] Problème avec boucle 'FOR'
    Par BnA dans le forum Flash
    Réponses: 7
    Dernier message: 02/11/2006, 09h26
  5. [Tableaux] Problème avec boucle
    Par MYster dans le forum Langage
    Réponses: 6
    Dernier message: 11/11/2005, 18h39

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