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 :

Aide SVP probleme scanf


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 4
    Par défaut Aide SVP probleme scanf
    bonsoir tout le monde

    voila j'ai decouvert ce site riche en information sauf que voila j'ai pas reussi
    a trouver une solution a mon probleme, sa fait pas longtemps que je programme en c et je voudrai vous demandez a vous amis programmeur comment fait t'on pour recuperer un espace a l'aide de scanf
    exemple :
    char tab[50];

    scanf("%s",tab);

    le probleme ici c'est qu'il s'arrete lorsqu'il y a un espace
    j'ai essayer cette methode :
    scanf("%[^\n],tab);
    mais cette fois ci le probleme c'est que dés que j'arrive a cet appel il execute pas c'est a dire il passe le scanf ensuite il affiche que tab vaut n'importe quoi
    donc est ce qu'il y a quelqu'un qui pourrait m'aider svp , est est ce qu'il existe une fonction qui recupere une chaine avec des espace?

    merci d'avance

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    scanf, comme son nom l'indique est utilisé pour saisir des données formatées (f de scanf).
    Pour la saisie de chaînes de caractères, il considère que les mots sont séparés par des espaces, donc problèmes.
    Utilise fgets(buf, sizeof(buf), stdin) qui est la SEULE fonction adaptée à la saisie de chaînes au clavier.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre chevronné Avatar de Rei Angelus
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2006
    Messages
    292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 292
    Par défaut
    Le scanf est en effet parfois difficile à utiliser

    1) http://xrenault.developpez.com/tutoriels/c/scanf/ Cela pourra surement d'aider.

    2) sinon utilise plutôt quelquechose du genre fgets()

  4. #4
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 4
    Par défaut
    merci a vous 2 pour votre reponse rapide
    d'apres les tuto j'ai toujours cru que fgets c'estait pour prendre une chaine dans un fichier, je viens de tester la commande mais je sais pas comment lui dire de recuperer une chaine que j'ai taper en essayant d'utiliser cette fonction car je penser que fgets s'ecrivait toujours
    fgets(chaine,taille de la chaine,nomfichier)
    j'ai utiliser cette syntaxe et elle m'affiche = a l'ecran sans que je tape quoi que ce soit .

  5. #5
    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 ceagle75
    d'apres les tuto j'ai toujours cru que fgets c'estait pour prendre une chaine dans un fichier, je viens de tester la commande mais je sais pas comment lui dire de recuperer une chaine que j'ai taper en essayant d'utiliser cette fonction car je penser que fgets s'ecrivait toujours
    fgets(chaine,taille de la chaine,nomfichier)
    j'ai utiliser cette syntaxe et elle m'affiche = a l'ecran sans que je tape quoi que ce soit .
    Jamais tu lis les réponses ?
    Citation Envoyé par Trap D
    Utilise fgets(buf, sizeof(buf), stdin) qui est la SEULE fonction adaptée à la saisie de chaînes au clavier.
    Et si je met ces liens, je perd mon temps ?

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

  6. #6
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 4
    Par défaut
    merci emmanuelle et tout ce qui essaye de m'aider
    j'ai compris leur reponse et la tienne , en faite c'est moi qui n'a pas tout detaillé, bon comme vous le savez je suis pas un expert en c

    en faites ce que je voulai faire , c'est recuperer une chaine de caractere que j'ai taper a l'écran pour la stocker dans une structure , donc voila ce que j'ai fait :
    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
     
    typedef struct nono nono;
    struct nono{
    char nom[taille];
    .
    .
    .}
    int main(){
    long conf;
    nono pers[taille];
    printf("taper le nombre de joueur\n");
    scanf("%ld",&conf);
    for(i=0;i!=conf;i++){
       printf("joueur %ld taper votre nom",i+1);
       fgets(pers[i].nom,sizeof(pers[i].nom),stdin);
       fprintf(fichier,"\t%s \n",pers[i].g);
    printf("\n");}
    j'ai pa tout detaillé car sa fera long

    voila et le programme bloque lors de la demande du nom donc je voudrais savoir comment faire pour que je puisse taper mon prenom "jean pierre" en prenant compte les espaces et qui le stocke dans le fichier

    pour le fonctionnement de fgets j'ai compris et merci pour les liens , mais j'ai un probleme avec les structure en faites et je maitrise pas a 100% , donc si je comprend au moins sa sa serait cool .

    merci d'avance

  7. #7
    Membre éprouvé
    Inscrit en
    Novembre 2002
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 120
    Par défaut
    A mon avis le problème ne se situe pas au niveau du fgets() mais au niveau du scanf() juste au dessus, qui demande le nombre du joueur: en effet tu t'attends à ce que l'utilisateur tappe '\n' pour valider le nombre, non? Dans ce cas le '\n' ne sera pas extrait par scanf() mais par fgets(). Et comme fgets() s'arrête au premier retour ligne, tu auras une chaîne vide.

    Je pense que si tu fais scanf("%ld\n", &conf); ça devrait marcher. Encore mieux: utilise fgets() pour stocker ce que l'utilisateur a saisi sous forme de chaîne de caractères et fait un strtol() dessus

    [edit]Dans le deuxième scanf(), n'oublie pas que le retour ligne est aussi stocké dans la chaîne de caractères, donc ne pas oublier de le supprimer avant d'envoyer vers le fichier.

  8. #8
    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 ceagle75
    merci emmanuelle
    In your dreams, man. I'm a he !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    scanf("%ld",&conf);
    for(i=0;i!=conf;i++){
       printf("joueur %ld taper votre nom",i+1);
       fgets(pers[i].nom,sizeof(pers[i].nom),stdin);
    L'dée, c'est d'éliminer complètement les scanf() et de les remplacer par des fgets() bien utilisés.

  9. #9
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 4
    Par défaut
    bonjour

    merci shootDX et emmanuel(j'ai mis un e en plus dans ton pseudo sorry ) j'ai enfin reussi grâce a vous mais j'ai un autre petit probleme
    enfaite il ecrit dans le fichier mais a chaque fois il retourne à la ligne y a t-il une maniére de dire a fgets() de ne pas retourner à la ligne et de continuer sur la meme ligne ?

    ps: shootDX j'ai essayer la premiere methode en incluant \n dans scanf :
    et par la suite j'ai netoyer le buffer mais elle ne marche pas , en tous cas l'essentiel c'est que sa marche mais qu'avec fgets() .

  10. #10
    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 ceagle75
    merci shootDX et emmanuel(j'ai mis un e en plus dans ton pseudo sorry )
    C'est pas un pseudo...
    enfaite il ecrit dans le fichier mais a chaque fois il retourne à la ligne y a t-il une maniére de dire a fgets() de ne pas retourner à la ligne et de continuer sur la meme ligne ?
    Quel "il" ?

    C'est pas très clair. Tu peux monter ton code et un exemple d'utilisation ?

    Est-tu bien conscient que le rôle premier de fgets() est de saisir une ligne ?

  11. #11
    Membre éprouvé
    Inscrit en
    Novembre 2002
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 120
    Par défaut
    Ah oui, le nombre du joueur et le joueur lui-même sont sur la même ligne. Dans ce cas: tu lis d'abord ton nombre avec strtoul() puis, comme cette fonction peut t'indiquer où est-ce que la conversion s'achève, c'est-à-dire la position du prochain caractère qui n'est pas un chiffre dans la base de numérotation choisie, l'extraction devient un jeu d'enfant! Exemple:

    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
    #include <stdio.h>
    #include <string.h>
    #include <limits.h>
     
    char line[BUFSIZ];
    unsigned long n;   /* nombre du joueur */
    const char *ptr;   /* position courante dans line */
     
    if (NULL == fgets(line, sizeof line, stdin))
    {
       /* Gestion de l'erreur */
    }
    ptr = strchr(line, '\n');
    if (ptr == NULL)
    {
       /* Le buffer n'est pas assez grand pour contenir toute la ligne.
        * Gestion de l'erreur.
        */
    }
    *ptr = '\0';   /* on retire le retour ligne terminal */
    n = strtoul(line, &ptr, 10);
    if (ptr == line)
    {
       /* Pas de nombre lu. Gestion de l'erreur. */
    }
    if (n == ULONG_MAX)
    {
       /* overflow. Gestion de l'erreur. */
    }
    if (*ptr != ' ')
    {
       /* Nombre invalide. Gestion de l'erreur. */
    }
    while (*++ptr == ' ');
    if (*ptr == '\0')
    {
       /* Pas de nom de joueur. Gestion de l'erreur. */
    }
     
    /* Le numéro du joueur se trouve dans n et le nom du joueur dans ptr */

Discussions similaires

  1. probleme libxml besoin d'aide SVP
    Par air1du62 dans le forum C
    Réponses: 2
    Dernier message: 28/04/2010, 15h30
  2. Aide SVP probleme "espace"
    Par Kermouse dans le forum C
    Réponses: 8
    Dernier message: 18/06/2006, 19h29
  3. A l'aide svp j'ai de gros problemes sur un script php
    Par schtek2 dans le forum Langage
    Réponses: 1
    Dernier message: 24/04/2006, 01h25

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