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 scanf()


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut Problème avec scanf()
    Bonjour,

    s'il vous plaît j'ai un problème avec un code que j'essaye d'écrire. Le but de ce code est le suivant : on lui écrit une date par exemple 07 12 2016 et il répond par : le 7 Décembre 2016. Le problème c'est que quand j'initialise la variable langue par 1 ou par 2 ça fonctionne très bien, mais quand je veux demander à l'utilisateur de choisir la langue (Français ou Anglais) en utilisant scanf() ça ,ne fonctionne pas.

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #define TAILLE_MAX 100
     
    int main()
    {
        //=========On initialise deux tableaux de mois en francais et en anglais============
        char MFRAN[12][20]={"Janvier","Fevrier","Mars","Avril","Mai","Juin","Juillet","Aout","Septembre","Octobre","Novembre","Decembre"};
        char MENG[12][20]={"Junuary","February","March","April","May","June","July","August","September","October","November","December"};
     
        printf("Choisissez une langue\n1-Francais\n2-Anglais\n");
     
        int langue=2;   /* C'est ici que j'ai le problème, si je demande à l'utilisateur de choisir la langue avec scanf()
         ça fonctionne pas, pour l'instant si on veut le francais on initialise langue par 1 si on veut anglais on l'initialise
         par 2*/
     
        if(langue == 1){
               char date[TAILLE_MAX]={0};
               printf("Entrez une date comme l'exemple suivant : 09 04 1996\n");
               scanf("%[^\n]",date);            //J'utilise le [^\n] pour pouvoir stocker l'éspace
               char mois[2],Mois=0;
               int moisInt=0,MoisInt=0,test=0;
               //=====J'effectue un teste si le mois s'écrit 02 par exemple  ou bien 11========
               if (date[3]!='0')
               {
                   mois[0]=date[3];
                   mois[1]=date[4];
                   moisInt = atoi(mois);
                   test=1;
     
               }
               else if (date[3]=='0')
               {
                   Mois=date[4];
                   MoisInt=atoi(&Mois);
                   test=2;
     
               }
               if (test==1)
                printf("Le %c%c %s %c%c%c%c:\n",date[0],date[1],MFRAN[moisInt-1],date[6],date[7],date[8],date[9]);
               if (test==2)
                printf("Le %c %s %c%c%c%c:\n",date[1],MFRAN[MoisInt-1],date[6],date[7],date[8],date[9]);
        }
     
        if (langue == 2){
            char date[TAILLE_MAX]={0};
               printf("Enter a date, for example: 09 04 1996\n");
               scanf("%[^\n]",date);
               char mois[2],Mois=0;
               int moisInt=0,MoisInt=0;
               int test1=0,test2=0,test3=0;
               //=====J'effectue un teste si le mois s'écrit 02 par exemple  ou bien 11========
               if (date[3]!='0')
               {
                   mois[0]=date[3];
                   mois[1]=date[4];
                   moisInt = atoi(mois);
                   test1=1;
     
               }
               else if (date[3]=='0')
               {
                   Mois=date[4];
                   MoisInt=atoi(&Mois);
                   test1=2;
               }
    //=======Je teste si le jour est entre 1 et 4 pour savoir si je dois écrire 'st' ou bient 'nd' ou bien 'rd' ou bien 'th'=========
                if(date[1]=='1')
                    test3=1;
                else if (date[1]=='2')
                    test3=2;
                else if (date[1]=='3')
                    test3=3;
                else if(date[1]=='4')
                    test3=4;
     
               if (date[0]=='0')
                    test2=2;
               else if(date[0]!='0')
                    test2=1;
               if (test1==1)
               {
                   if (test2==1) /*Ce test a pour but de voir si on a le jour écrit par exemple 01 ou bien 11 pour que si c'est écrit
                                    on enlève le 0*/
                    printf(" %s %c%cth %c%c%c%c:\n",MENG[moisInt-1],date[0],date[1],date[6],date[7],date[8],date[9]);
                   else if(test2==2)
                    printf(" %s %c %c%c%c%c:\n",MENG[moisInt-1],date[1],date[6],date[7],date[8],date[9]);
               }
               if (test1==2){
                    if(test2==1)
                        printf(" %s %c%cth %c%c%c%c:\n",MENG[MoisInt-1],date[0],date[1],date[6],date[7],date[8],date[9]);
                        //======Le switch pour voir ce qu'on va écrire à côté du jour ('st' ou'nd ou'rd' ou 'th')=======
                    else if(test2==2)
                    {
                        switch(test3){
                        case 1:printf(" %s %cst %c%c%c%c:\n",MENG[MoisInt-1],date[1],date[6],date[7],date[8],date[9]);break;
                        case 2:printf(" %s %cnd %c%c%c%c:\n",MENG[MoisInt-1],date[1],date[6],date[7],date[8],date[9]);break;
                        case 3:printf(" %s %crd %c%c%c%c:\n",MENG[MoisInt-1],date[1],date[6],date[7],date[8],date[9]);break;
                    }
                    }
        }
        }
        return 0;
    }

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 17
    Points : 26
    Points
    26
    Par défaut
    Le problème semble venir de ton scanf qui lit la date entrée par l'utilisateur :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%[^\n]",date);

    si tu ajoutes un printf pour afficher ta variable date juste après ce scanf, tu verras le problème.
    Peut être que la fonction strsplit pourrait t'aider dans ce cas.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Je n'ai jamais utilisé cette fonction dont vous avez parlé. Est ce qu'il est possible que vous me donner un exemple d'utilisation

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Il semblerait qu'il te manque le code pour choisir la langue. Est-ce que tu l'as fait ou tu cherches à le faire?

    Parce que dans le code que tu montres, il semblerait qu'il te manque la partie où tu demandes à l'utilisateur une langue.

    Remarque générale: scanf est remplie de soucis, il vaut mieux ne pas s'en servir ;-)

    Petite remarque: c'est January ;-)

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 17
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par fearyourself Voir le message

    Remarque générale: scanf est remplie de soucis, il vaut mieux ne pas s'en servir ;-)
    Exact, d'ailleurs je te conseille d'utiliser la fonction read() à la place, ou bien scanf(). Par exemple dans ton cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char langue[2];
    ...
    read(STDIN_FILENO, langue, 2);
    ...
    fgets(date, TAILLE_MAX, stdin);
    langue étant un char*, il te suffira d'utiliser la fonction atoi() pour convertir la valeur en int et ainsi effectuer la comparaison.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Oui effectivement fearyourself c'est le code pour choisir la langue qui me créait le problème.
    merci pour la remarque

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup personne.c votre solution a bien fonctionné.

  8. #8
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Hmm. Je n'utiliserai pas read non plus mais fgets avec un traitement d'erreur digne de ce nom

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    fearyourself, qu'est ce qui ne va pas avec read ?

  10. #10
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Read est très bas niveau. Or fgets s'arrête à la fin de ligne plus gentillement.

    Read utilise les file descriptor, fgets utilise un FILE*.

    La vérification d'erreur sur fgets est un peu plus facile, on sait qu'on traite une ligne (ou une partie)...

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 17
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par fearyourself Voir le message
    Hmm. Je n'utiliserai pas read non plus mais fgets avec un traitement d'erreur digne de ce nom

    Bien entendu, je lui montrais juste les choix possible qui s'offrent à lui. Personnellement, j'ai l'habitude d'utiliser read (jusqu'à rencontre un retour à la ligne ou un EOF) mais dans son cas, un fgets avec un traitement d'erreur est suffisant.

  12. #12
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Je suis d'accord. Je vois l'utilité de read quand on fait du vraiment bas niveau. Mais en général, je trouve que c'est déjà assez difficile le C qu'il vaut mieux simplifier les choses

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

Discussions similaires

  1. Problème avec "SCANF"
    Par condor666 dans le forum Débuter
    Réponses: 2
    Dernier message: 28/03/2008, 11h20
  2. Problème avec scanf("%s",str)
    Par mathieumadrid dans le forum C
    Réponses: 4
    Dernier message: 18/12/2006, 16h47
  3. problème avec scanf
    Par mimina dans le forum C
    Réponses: 27
    Dernier message: 13/11/2006, 19h30
  4. problème avec scanf
    Par thierry_b dans le forum C
    Réponses: 10
    Dernier message: 21/12/2005, 20h10
  5. problème avec scanf
    Par troumad dans le forum C
    Réponses: 30
    Dernier message: 20/11/2005, 15h21

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