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 :

la fonction scanf?


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Février 2010
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 33
    Par défaut la fonction scanf?
    vous savez bien que lors de l'utilisation de la fonction "scanf("%s",&variable)"
    si on donne un nom (prenom et nom) dont il separe un "space" scanf alors prend seulement le premier mot.
    comment faire pour ne pas tomber dans ce probleme?

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Voici un tutoriel qui explique en détail le fonctionnement de scanf.

    Au passage, dans ton cas, il me semble que scanf n'est pas forcement la fonction à utiliser : tu peux faire plus simple en utilisant fgets.
    Dernière modification par Invité(e) ; 08/02/2010 à 13h16. Motif: oublie du lien

  3. #3
    Membre averti
    Inscrit en
    Février 2010
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 33
    Par défaut
    Citation Envoyé par mabu Voir le message
    Bonjour,

    Voici un tutoriel qui explique en détail le fonctionnement de scanf.

    Au passage, dans ton cas, il me semble que scanf n'est pas forcement la fonction à utiliser : tu peux faire plus simple en utilisant fgets.

    Mon projet est de faire un programme d'informations sur quelques choses et je veux utiliser le type formatté mais je veux savoir avant de commencer si je peux utiliser dans ce cas la fonction gets() pour introduire une chaine de caracteres?

  4. #4
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Non, car gets n'est pas securisé (contre le depassement). Preferer utiliser fgets, qui est comme gets mais securiser.

  5. #5
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 23
    Par défaut
    Bonjour,

    Va voir plutôt sscanf, sauf que la il faut utiliser un buffer.

    Mais la meilleure solution reste fgets.

  6. #6
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Si c'est pour ton utilisation exclusive, tu peux utiliser gets. Tu sais ce qu'il faut faire et ce qu'il ne faut pas faire, donc tu n'est pas l'utilisateur lambda qui entrera n'importe quoi
    Après il faut vraiment savoir ce que tu fais sinon tu feras comme l'utilisateur lambda

  7. #7
    Membre averti
    Inscrit en
    Février 2010
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 33
    Par défaut
    Citation Envoyé par SofEvans Voir le message
    Non, car gets n'est pas securisé (contre le depassement). Preferer utiliser fgets, qui est comme gets mais securiser.
    pouvez-vous me donner un petit exemple comment utiliser la fonction fgets?
    un petit programme suffit

  8. #8
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671

  9. #9
    Nouveau candidat au Club
    Inscrit en
    Février 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 3
    Par défaut
    ben le plus simple pour toi c de faire deux variables de lecture nom et prenom par exemple et de les faire lire par scanf en plus pour un usage dans ton programme c mieux de les avoir divisé mais bon c toi ki programme alors a toi le choix mais le fgets resout ton problem de lecture d'espace

  10. #10
    Membre averti
    Inscrit en
    Février 2010
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 33
    Par défaut
    Citation Envoyé par Pouet_forever Voir le message

    j'essayais d'utiliser fgets() mais quand j'introduis le nom et je tape "ENTER" ensuite j'introduis le ID (par exemple) et j'ecris le tous dans un fichier il y en a un saut de ligne entre le nom w l'ID

    comment faire pour passer ce probleme???

  11. #11
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par bilal_sayed1 Voir le message
    j'essayais d'utiliser fgets() mais quand j'introduis le nom et je tape "ENTER" ensuite j'introduis le ID (par exemple) et j'ecris le tous dans un fichier il y en a un saut de ligne entre le nom w l'ID

    comment faire pour passer ce probleme?
    Montre nous ton code.

  12. #12
    Membre averti
    Inscrit en
    Février 2010
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 33
    Par défaut
    Citation Envoyé par mabu Voir le message
    Montre nous ton 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
    #include <stdio.h>
    #include <conio.h>
    void main()
      {
      File *g;
      char *user;
      int ID;
      g=fopen("USER.dta","w");
      if(g!=NULL)
        {
        fgets(user,30,stdin);
        scanf("%d",&ID);
        fprintf("%s\t%d",user,ID);
        }
      fclose(g);
      }
    "user" etant la variable dans laquelle je veux mettre la chaine de characteres
    "30" etant le nb max de caracteres pou la chaine

    s'il vous plait me dire ou est le probleme?

  13. #13
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 23
    Par défaut
    Salut,

    il faut d'abord réserver de l'espace pour ta chaine user soit tu fais:
    ou alors tu alloues dynamiquement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     user = malloc( sizeof( char ) * 30 );

  14. #14
    Membre averti
    Inscrit en
    Février 2010
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 33
    Par défaut
    Citation Envoyé par maximus15 Voir le message
    Salut,

    il faut d'abord réserver de l'espace pour ta chaine user soit tu fais:
    ou alors tu alloues dynamiquement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     user = malloc( sizeof( char ) * 30 );
    meme probleme!!!!

  15. #15
    Invité(e)
    Invité(e)
    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
    #include <stdio.h>
    int main(void)
    {
        /* on réserve un tableau de 30 caractères pour user */
        char user[30];
        int ID;
        /* remplissage de user*/
        fgets(user, sizeof user, stdin);
        /* init de ID */
        scanf("%d", &ID);
        printf("%s\t%d", user, ID);
     
        return 0;
    }
    PS : attention, File et FILE sont différents, fprintf prend un paramètre de plus.

  16. #16
    Membre averti
    Inscrit en
    Février 2010
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 33
    Par défaut
    Citation Envoyé par mabu Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    int main(void)
    {
        /* on réserve un tableau de 30 caractères pour user */
        char user[30];
        int ID;
        /* remplissage de user*/
        fgets(user, sizeof user, stdin);
        /* init de ID */
        scanf("%d", &ID);
        printf("%s\t%d", user, ID);
     
        return 0;
    }
    PS : attention, File et FILE sont différents, fprintf prend un paramètre de plus.


    encore je tombe dans le meme probleme!

  17. #17
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par bilal_sayed1 Voir le message
    encore je tombe dans le meme probleme!
    Et oui, fgets laisse le '\n' dans la chaine :
    Citation Envoyé par man fgets
    fgets() lit au plus size - 1 caractères depuis stream et
    les place dans le buffer pointé par s. La lecture
    s'arrête après EOF ou un retour-chariot. Si un retour-
    chariot (newline) est lu, il est placé dans le buffer. Un
    caractère nul '\0' est placé à la fin de la ligne.
    Pour retirer le '\n' de la chaine, il suffit de le chercher et le remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        /* remplissage de user*/
        fgets(user, sizeof user, stdin);
     
       { 
            /* recherche du saut de ligne */
            char *p = strchr(user, '\n');
            if(NULL != p) {  
                /* remplacement du saut de ligne par un fin de chaine */
                *p = '\0';
            }
        }

  18. #18
    Membre averti
    Inscrit en
    Février 2010
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 33
    Par défaut
    Citation Envoyé par mabu Voir le message
    Et oui, fgets laisse le '\n' dans la chaine :

    Pour retirer le '\n' de la chaine, il suffit de le chercher et le remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        /* remplissage de user*/
        fgets(user, sizeof user, stdin);
     
       { 
            /* recherche du saut de ligne */
            char *p = strchr(user, '\n');
            if(NULL != p) {  
                /* remplacement du saut de ligne par un fin de chaine */
                *p = '\0';
            }
        }

    MERCIIII beaucoup mabu et ca marche bien

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

Discussions similaires

  1. une implantation sommaire de la fonction scanf
    Par chalalalo dans le forum Débuter
    Réponses: 2
    Dernier message: 16/06/2009, 15h40
  2. Problème avec la fonction scanf
    Par arnodujura dans le forum Débuter
    Réponses: 2
    Dernier message: 06/03/2009, 17h33
  3. Probleme de fonction scanf()
    Par nuFox dans le forum Débuter
    Réponses: 7
    Dernier message: 09/04/2008, 12h54
  4. Implémenter la fonction Scanf
    Par CPI_en_mousse dans le forum C
    Réponses: 2
    Dernier message: 06/04/2006, 18h58
  5. [debutant]la fonction scanf
    Par kalaka dans le forum C
    Réponses: 7
    Dernier message: 01/07/2003, 15h15

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