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èmes scanf


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 214
    Par défaut Problèmes scanf
    Slt, j'utilise QtCreator comme EDI pour un projet en C, tout marche bien, il détecte automatiquement les fichiers .c et les compile avec gcc et pas g++. Par contre dès que je fais un scanf, plus rien ne fonctionne, c'est vraiment étonnant. on dirait que le programme ne s'exécute pas qu'il tourne à vide. Impossible d'utiliser le débugger. Vraiment étonnant. Quelqu'un aurait une idée du problème ?

    Merci d'avance.
    Cordialement.

    EDIT : En fait c'est carrément pour n'importe quelle entrée standard. Même fgets avec stdin en paramètres. J'ai essayé de l'exécuter dans un terminal mais c'est encore pire, ça ne fait rien même en enlevant les entrées.

    Je suis sous Ubuntu 10.10 en 64bits avec QtCreator 2.0.1

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Salut

    Le mieux serait d'avoir un exemple minimaliste...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Je dirai que QtCreator, même en étant un bon EDI, n'est pas fait pour le C, mais plus pour du C++ / Qt.
    Donc je vous conseille de vous pencher sur Code::blocks au lieu de chercher compliqué.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 214
    Par défaut
    Je trouve ça dommage car tout fonctionne très bien sauf les entrées standard. C'est vraiment un EDI que j’apprécie.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par barbug Voir le message
    Je trouve ça dommage car tout fonctionne très bien sauf les entrées standard. C'est vraiment un EDI que j’apprécie.
    Non mais soyons sérieux. A mon avis, quand cet EDI a été proposé, il a d'abord été testé. Et les stdin ont très certainement été testées aussi.

    Donc si tes stdin ne fonctionnent pas, j'aurais plus tendance à penser que ça vient de l'ICC que de l'EDI...

    T'aurais pas un exemple simple de stdin HS ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2010
    Messages : 7
    Par défaut
    HS : C'est quoi la différence entre EDI et IDE ?

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Citation Envoyé par Voitures007 Voir le message
    HS : C'est quoi la différence entre EDI et IDE ?
    Aucune ... EDI c'est en français IDE en anglais
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 214
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Non mais soyons sérieux. A mon avis, quand cet EDI a été proposé, il a d'abord été testé. Et les stdin ont très certainement été testées aussi.

    Donc si tes stdin ne fonctionnent pas, j'aurais plus tendance à penser que ça vient de l'ICC que de l'EDI...

    T'aurais pas un exemple simple de stdin HS ???
    A la base c'est un EDI pour des intefaces graphiques donc non, pas forcément... D'autant plus que j'avais remarqué que l'utilisation d'un cout dans un projet Qt faisait planter l'appli donc bon... Ils l'ont peut-être corrigé depuis.

    Sinon, un exemple, je vais l'écrire puisque ça a l'air si difficile d'écrire un code contenant un scnaf.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <stdio.h>
    int main()
    {
        int res;
        printf("avant\n");
        scanf("%d", res);
        printf("après\n");
     
        return 0;
    }// main()
    Si tu as de la chance il affichera "avant" mais normalement il n'affiche carrément rien. En console par contre ça marche parfaitement.

  9. #9
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Je pense que cela fonctionne très bien dans QtCreator.
    Premièrement, le std::cout fonctionne très bien (sauf si vous avez tester dans la version -0.2 ... mais bon ... je pense que cela a toujours fonctionné)

    Maintenant, pour le printf, il marche aussi correctement dans QtCreator ... sauf que je ne suis pas sur qu'il soit afficher par l'EDI (ou alors, juste dans la fenêtre de Sortie (Output)).

    Pour le scanf ...vous ne dites pas vraiment le problème. Par le message, "il tourne à vide" j'imagine simplement, que c'est qu'il attend une entrée.
    Entrée qu'il faut mettre dans la fenêtre "Sortie" (Output)... pour donner les valeurs aux scanf (on pourra donc dire que la fenêtre "Sortie" est une réplique de la console)

    Donc ce n'est pas un bug

    Le nom exacte de ce que j'appelle "Sortie" c'est "Sortie de l'application" que l'on peut cliquer dessus en bas de l'EDI
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par barbug Voir le message
    A la base c'est un EDI pour des intefaces graphiques donc non, pas forcément... D'autant plus que j'avais remarqué que l'utilisation d'un cout dans un projet Qt faisait planter l'appli donc bon... Ils l'ont peut-être corrigé depuis.

    Sinon, un exemple, je vais l'écrire puisque ça a l'air si difficile d'écrire un code contenant un scnaf.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
    int main()
    {
        int res;
        printf("avant\n");
        scanf("%d", res);
        printf("après\n");
     
        return 0;
    }// main()
    Si tu as de la chance il affichera "avant" mais normalement il n'affiche carrément rien. En console par contre ça marche parfaitement.
    Hum... "parfaitement" c'est un peu exagéré. T'as essayé d'afficher "res" après la saisie ???

    Voici déjà un premier code un poil plus fonctionnel.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
    int main()
    {
        int res;
        printf("avant\n");
        scanf("%d", &res);
        printf("après (res=%d)\n", res);
    
        return 0;
    }// main()

    Ensuite, et c'est un sujet récurrent sur ce forum, l'utilisation de scanf est très déconseillée pour 2 raisons
    1) scanf attend une entrée "formatée" et toi, tu tapes des trucs qui sont tout sauf formatés
    2) même si tu tapes correctement un nombre, tu termines ta saisie en appuyant sur <return>. Ben ce <return> n'étant pas un nombre n'est donc pas traité par scanf() et reste dans le buffer stdin.
    Ensuite, au scanf() suivant, soit tu fais saisir une chaine et alors le <return> est consommé mais alors tu n'as pas le temps de taper ta réponse puisque le scanf() a déjà absorbé le <return> précédent ; soit tu demandes autre chose et alors il reste et bloque tout et met le bordel dans ta saisie...

    La solution de remplacement est la suivante
    1) tu fais saisir une chaine via fgets(). Ainsi, ton buffer stdin reste clean
    2) tu analyses la chaine via sscanf(). En plus, sscanf() te renvoie le nombre d'éléments correctement récupérés => permet de détecter une erreur de saisie

    Exemple

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
    int main()
    {
        int res;
        char saisie[1024];
        printf("avant\n");
        fgets(saisie, 1024, stdin);
        if (sscanf(saisie, "%d", &res) != 1)
             printf("Erreur de saisie\n");
        else
            printf("après (res=%d)\n", res);
       return 0;
    }// main()
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 214
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ensuite, et c'est un sujet récurrent sur ce forum, l'utilisation de scanf est très déconseillée pour 2 raisons
    HS
    Je vois que n'as pas lu mon problème. Le code que j'ai mis est un exemple que j'ai écris comme ça. Ce n'est pas mon code. C'était plus rapide de donner un code avec un scanf plutôt que un code correct le but étant de montrer le bug et pas faire un code correct. Merci tout de même pour le conseil.

    Comme je l'ai dit auparavant mon code fonctionne parfaitement en console, donc ce n'est pas un problème de ce genre, il ne fait juste rien dans QtCreator. Je crois que la seule solution est d'essayer car je ne peux pas être plus clair que "il ne fait rien", quand j'essaye de débugger et mettre un point d’arrêt au début du main, il ne l'atteint même pas la plupart du temps. Par contre dès que j'enlève le scanf (ou toute fonction de lecture sur stdin comme fgets par exemple ), tout fonctionne parfaitement.

    Merci d'avance.

    Cordialement.

  12. #12
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par barbug Voir le message
    HS
    Je vois que n'as pas lu mon problème. Le code que j'ai mis est un exemple que j'ai écris comme ça. Ce n'est pas mon code. C'était plus rapide de donner un code avec un scanf plutôt que un code correct le but étant de montrer le bug et pas faire un code correct. Merci tout de même pour le conseil.

    Comme je l'ai dit auparavant mon code fonctionne parfaitement en console, donc ce n'est pas un problème de ce genre, il ne fait juste rien dans QtCreator. Je crois que la seule solution est d'essayer car je ne peux pas être plus clair que "il ne fait rien", quand j'essaye de débugger et mettre un point d’arrêt au début du main, il ne l'atteint même pas la plupart du temps. Par contre dès que j'enlève le scanf (ou toute fonction de lecture sur stdin comme fgets par exemple ), tout fonctionne parfaitement.

    Merci d'avance.

    Cordialement.
    Ouais, t'as tout à fait raison. J'ai téléchargé QtCreator, installé QtCreator et chez-moi, le simple code suivant
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
     
    int main()
    {
        char res[1024];
        printf("Entrez res\n");
        scanf("%s", res);
        printf("res=[%s]\n", res);
    }
    Et j'ai aucun résultat dans QtCreator alors que compiler et lancer ce code en console fonctionne parfaitement.
    A noter effectivement que remplacer scanf() par fgets() ne change rien. En revanche, supprimer tout accès à stdin et là j'ai bien un affichage.

    Ensuite, je me suis dit "ok, QtCreator est fait pour du C++ donc on va écrire la même chose en C++"

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        char res[1024];
        cout << "Entrez res\n";
        cin>>res;
        cout <<"res=[" << res << "]\n";
    }
    Là, j'arrive à avoir le message "Entrez res" mais rien de plus.

    Je peux rien dire de plus en dehors de "t'avais raison et j'ai eu tort, l'erreur ne vient pas de l'ICC". Je présume qu'étant donné que QtCreator est avant-tout conçu pour Qt, il faut passer par des outils Qt (QLineEdit, QTextEdit, etc) pour programmer des IO et que des IO à base de printf()/scanf()/cout/cin ne sont pas les bienvenues...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 214
    Par défaut
    C'est donc pas un problème de mon architecture. Dommage. J'aime vraiment cet EDI mais ça serait super qu'ils le rendent plus polyvalent. Notamment pour les projets non Qt. Il est possible de changer les étapes de compilations mais après le débuggage n'est plus possible. Et puis bon, il semblerait qu'il y ait des problèmes avec les entrées sorties. Enfin, surtout entrées.

    Merci à vous d'avoir pris du temps pour me répondre.

    Cordialement.

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

Discussions similaires

  1. problème scanf
    Par miamiam dans le forum Débuter
    Réponses: 3
    Dernier message: 26/11/2008, 17h40
  2. Débutant - Problème scanf
    Par Invité dans le forum Débuter
    Réponses: 2
    Dernier message: 08/01/2008, 00h30
  3. Problèmes "scanf", critiques et conseils.
    Par FOX19881 dans le forum C
    Réponses: 4
    Dernier message: 23/07/2006, 22h17
  4. problème avec scanf
    Par troumad dans le forum C
    Réponses: 30
    Dernier message: 20/11/2005, 15h21
  5. un problème tout bête de scanf !
    Par eizo dans le forum C
    Réponses: 9
    Dernier message: 31/10/2005, 12h29

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