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 :

cin.fail en Ctoutcourt??


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 51
    Par défaut cin.fail en Ctoutcourt??
    Bonjour
    Y a t il une fonction qui permet de controler une entrée scanf() comme en C++ avec cin.fail()?
    J'ai vu qu'il y avait une fonction du genre fgets() mais c'est pour un projet info de la fac et ils vont pas vouloir que j'utilise autre chose que scanf(), donc si ça existe... merci d'avance, sinon ben je ferais ça à la po-porc avec un tableau de caractères...
    ++

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Ben ca depend ce que tu veux controler.
    Si c'est bien un entier que tu a entré?
    Si scanf a echoué/marché
    Dis-nous en plus

    Citation Envoyé par Sebsheep
    c'est pour un projet info de la fac et ils vont pas vouloir que j'utilise autre chose que scanf()
    Y'en a je suis sûr qu'ils vont gueuler.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 51
    Par défaut
    ben en fait je voudrais un truc qui me dise "scanf a echoué" lorsque on rentre un format invalide. Et oui je voudrais tester des entiers... mais bon entiers et caractères y a pas grande différence de toute facon

  4. #4
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Tu peux faire comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    scanf("%s", machaine);
    if(sscanf(machaine, "%d", &monentier) < 1) {
        printf("Vous n'avez pas entré un entier");
        exit(EXIT_FAILURE);
    }
    Certains preferent strtol avec fgets, à toi de voir ce que tu preferes.
    http://emmanuel-delahaye.developpez....tes.htm#saisie

  5. #5
    Membre émérite
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Par défaut
    Citation Envoyé par Skyrunner
    Tu peux faire comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    scanf("%s", machaine);
    if(sscanf(machaine, "%d", &monentier) < 1) {
        printf("Vous n'avez pas entré un entier");
        exit(EXIT_FAILURE);
    }
    Enfer et Damnation ! Non !
    Quand on propose une solution avec scanf, on s'assure de sa validité / solidité...
    La, le scanf est horriblement mal utilisé, et laisse la voie grande ouverte à n'importe quel débordement de buffer !

    Pour la saisie de chaines, scanf est extremement ardue à utiliser...
    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
     
    char tab[81] = {0};
    int c;
     
    if (scanf("%80[^\n]", tab) == 1){
        /* saisie reussie */
        if ( (c = getchar() ) != '\n') {
            /* saisie trop longue */
            /* vidage buffer si besoin est... */
        }
    ...
    }
    else {
        /* echec de la saisie */
        /* vidage buffer si besoin est... */
    ....
    }
    => C'est le minimum pour faire de la saisie sécurisée de "chaîne".
    On peut faire directement les tests de validités de l'entrée, mais ça devient un peu "tricky"...
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  6. #6
    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: cin.fail en Ctoutcourt??
    Citation Envoyé par Sebsheep
    Y a t il une fonction qui permet de controler une entrée scanf()
    scanf() çaÿ mal...

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

  7. #7
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par Pouic
    Enfer et Damnation ! Non !
    Quand on propose une solution avec scanf, on s'assure de sa validité / solidité...
    La, le scanf est horriblement mal utilisé, et laisse la voie grande ouverte à n'importe quel débordement de buffer !
    Oula on se detend Pouic, faut destresser.

    C'est juste que
    Citation Envoyé par Sebsheep
    ils vont pas vouloir que j'utilise autre chose que scanf()
    Si ils l'obligent a utiliser scanf et pas fgets je suis pas sur qu'il fasse attention aux possibles debordements de tampon.

  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 Skyrunner
    Si ils l'obligent a utiliser scanf et pas fgets je suis pas sur qu'il fasse attention aux possibles debordements de tampon.
    Et après on va dire que le C est un langage fragile. Il est mal enseigné, c'est tout.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 51
    Par défaut
    Citation Envoyé par Skyrunner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    scanf("%s", machaine);
    if(sscanf(machaine, "%d", &monentier) < 1) {
        printf("Vous n'avez pas entré un entier");
        exit(EXIT_FAILURE);
    }
    Merci beaucoup, donc en fait pour le fonctionnement, sscanf regarde ce qu'il y a dans machaine, regarde si c'est le bon type (ici "%d") et le met dans monentier si le format et bon et renvoie 1 sinon il renvoie 0, c'est ca?? j'ai compris??
    Par contre exite marche pas mais bon c'est pas grave vu que je veux pas quitter, mais bon ca mintrigue quand même . Je travaille avec dev-cpp

    Encore merci!

  10. #10
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par Sebsheep
    Citation Envoyé par Skyrunner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    scanf("%s", machaine);
    if(sscanf(machaine, "%d", &monentier) < 1) {
        printf("Vous n'avez pas entré un entier");
        exit(EXIT_FAILURE);
    }
    Merci beaucoup, donc en fait pour le fonctionnement, sscanf regarde ce qu'il y a dans machaine, regarde si c'est le bon type (ici "%d") et le met dans monentier si le format et bon et renvoie 1 sinon il renvoie 0, c'est ca?? j'ai compris??
    Par contre exite marche pas mais bon c'est pas grave vu que je veux pas quitter, mais bon ca mintrigue quand même . Je travaille avec dev-cpp

    Encore merci!
    exit y'a pas de e et sinon il faut inclure <stdlib.h>
    Citation Envoyé par man
    int sscanf (const char *str, const char *format, ...);
    sscanf lit ses entrées dans la chaîne de caractères pointée par str, conformément au format decrit
    En gros sscanf analyse la chaine et chercher si il y a un entier dedans si il reussi il renvoi le nombre d'elemnt correctement assigné, une valeur < 1 en cas d'echec
    Citation Envoyé par man
    Typiquement
    c'est un caractère d'entrée invalide qui en est la cause,
    par exemple un caractère alphabétique dans une conversion
    `%d'.

  11. #11
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 22
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Et après on va dire que le C est un langage fragile. Il est mal enseigné, c'est tout.

Discussions similaires

  1. assertion ou cin.fail
    Par warubi dans le forum SL & STL
    Réponses: 4
    Dernier message: 07/01/2007, 10h09
  2. STL cin, cout ...
    Par oxor3 dans le forum SL & STL
    Réponses: 11
    Dernier message: 29/08/2004, 16h22
  3. Réponses: 2
    Dernier message: 23/06/2004, 16h06
  4. regsvr32 failed en debug mais pas en release
    Par afan dans le forum DirectX
    Réponses: 1
    Dernier message: 09/06/2004, 10h32
  5. failed BULK COLLECT
    Par patmaba dans le forum SQL
    Réponses: 7
    Dernier message: 01/06/2004, 12h03

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