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 :

sscanf et EOF


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut sscanf et EOF
    Salute les gens,
    Juste une question, pourquoi sscanf ne me rend pas EOF en cas d'erreur sous linux?
    Elle me rend des grands nombres négatifs style: -54370 !!
    Merci
    Compil your life guy!
    The Aures Project

  2. #2
    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 Re: sscanf et EOF
    Citation Envoyé par Goundy
    Salute les gens,
    Juste une question, pourquoi sscanf ne me rend pas EOF en cas d'erreur sous linux?
    Elle me rend des grands nombres négatifs style: -54370 !!
    Merci
    Si sscanf() réussit ses conversions, il retourne le nombre de conversions réussies. Sinon, effectivement, la norme dit qu'il retourne EOF.
    Citation Envoyé par n1124
    7.19.6.7 The sscanf function
    Synopsis
    1 #include <stdio.h>
    int sscanf(const char * restrict s,
    const char * restrict format, ...);
    Description
    2 The sscanf function is equivalent to fscanf, except that input is obtained from a
    string (specified by the argument s) rather than from a stream. Reaching the end of the
    string is equivalent to encountering end-of-file for the fscanf function. If copying
    takes place between objects that overlap, the behavior is undefined.
    Returns
    3 The sscanf function returns the value of the macro EOF if an input failure occurs
    before any conversion. Otherwise, the sscanf function returns the number of input
    items assigned, which can be fewer than provided for, or even zero, in the event of an
    early matching failure.
    Peux-tu montrer le code qui ne fonctionne pas ?

  3. #3
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Envoie ton code mais il semblerai que tu dépasses la capacité de stokage de ton nombre, ainsi, à cuase du débordement, tu obtiens des nombres négatifs.

  4. #4
    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 PRomu@ld
    Envoie ton code mais il semblerai que tu dépasses la capacité de stokage de ton nombre, ainsi, à cuase du débordement, tu obtiens des nombres négatifs.
    Apparement, il s'agit du code retour et non de la valeur convertie...

  5. #5
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    Bonjour,
    Désolé, je n'ai pas posté du code hier, car je me disais que peut être sous linux c'été un peu différent (même si j'ai lus le contraire via Google).
    Voilà un bout de 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
     
    #include <stdio.h>
    unsigned long strToLint (const char* str)
    //fonction qui convertie une chaine en un entier long non signé
    // rend l'entier en cas de succes, ou EOF en cas d'echec (erreur dans la chaine)
    {
      unsigned long tmp;
        sscanf (str, "%ld", &tmp);
       return (tmp); 
    }
    int main(void){
          unsigned long k;
          char saisi[128]="";
     
     
            fgets (saisi, sizeof(saisi), stdin);
            k = strToLint (saisi);
             if (k == EOF) printf("Erreur dans votre saisie");
     
     return 0;
    }
    Donc, là quand je saisi n'importe quoi, ca ne m'affiche pas le EOF :/
    Ai-je fais une erreur?
    Compil your life guy!
    The Aures Project

  6. #6
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    EOF ne tient pas dans un unsigned (il peut etre negatif). De plus tu ne renvoies pas la valeur retour de sscanf() qui est err dans l'expression suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      err = sscanf(str, "%ld", &tmp);
    mais la valeur issue de l'analyse de la chaine passee en parametre, qui est tmp.

    Remarque egalement que ta chaine saisie conserve le '\n' qui n'est pas enleve par fgets. Ta fonction de saisie doit etre amelioree.

    EDIT: remarque egalement que tu re-invente la roue. strtol() fait exactement ce que tu souhaites, avec une bonne gestion d'erreur.

  7. #7
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    Héhé, je suis bête
    Merci
    Compil your life guy!
    The Aures Project

  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 Goundy
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    unsigned long strToLint (const char* str)
    //fonction qui convertie une chaine en un entier long non signé
    // rend l'entier en cas de succes, ou EOF en cas d'echec (erreur dans la chaine)
    {
      unsigned long tmp;
        sscanf (str, "%ld", &tmp);
       return (tmp); 
    }
    Donc, là quand je saisi n'importe quoi, ca ne m'affiche pas le EOF :/
    Ai-je fais une erreur?
    Oui, tu ne testes pas le retour de sscanf(). C'est cette valeur qui peut valoir EOF.

    En fait, en cas d'erreur elle retourne 0 (pas de conversion) ce qui est logique. Je ne vois pas bien comment elle pourrait retourner EOF, vu que ce n'est pas un flux...
    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
     
    #include <stdio.h>
     
    /* convertit une chaine en un entier long non signe
     * Retourne 1 en cas de succes (erreur dans la chaine)
     */
    int strToLint (const char* str, unsigned long *p_ul)
    {
       return sscanf (str, "%lu", p_ul);
    }
     
    int main(void)
    {
       char saisi[128];
     
       fgets (saisi, sizeof(saisi), stdin);
       {
          unsigned long k;
     
          int n = strToLint (saisi, &k);
     
          if (n == 1)
          {
             printf ("k = %lu\n", k);
          }
          else
          {
             printf("Erreur dans votre saisie (n=%d)\n", n);
          }
       }
       return 0;
    }

  9. #9
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    Ouais, en fait je croyais que c'été la valeur mise dans tmp qui pouvait valoir EOF :/
    Compil your life guy!
    The Aures Project

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

Discussions similaires

  1. Problème avec Do while rs.EOF
    Par lauraned dans le forum ASP
    Réponses: 12
    Dernier message: 21/05/2004, 12h00
  2. Fonction If avec rs.eof problème
    Par M1000 dans le forum ASP
    Réponses: 5
    Dernier message: 24/03/2004, 17h10
  3. modification de fichier EOF
    Par scorbo dans le forum C
    Réponses: 9
    Dernier message: 28/11/2003, 11h35
  4. RecordSet en EOF
    Par jfphan dans le forum ASP
    Réponses: 3
    Dernier message: 06/11/2003, 16h47
  5. Réponses: 4
    Dernier message: 12/09/2003, 11h38

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