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

Bibliothèque standard C Discussion :

Comportement de getc(), scanf(), etc.


Sujet :

Bibliothèque standard C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut Comportement de getc(), scanf(), etc.
    Bonjour,

    J'aimerais savoir comment font des fonctions comme scanf() et getc() pour suspendre l'exécution du programme et permetre à l'utuilisateur d'entrer du texte?

    Je demande cela parce que j'ai un programme qui affiche ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    [...]
     
    Quel mode souhaitez-vous utiliser? [0/1]
        1 = Par un fichier.
        2 = Par le clavier.
     
    [ ]
    La dernière ligne, où il y a des crochets, j'utilise l'instruction printf comme ceci :

    suivi d'un appel à scanf().

    Ainsi, lorsque l'utilisateur vient pour entrer 0 ou 1, le chiffre qu'il a entré est entre les crochets.

    Cependant, s'il entre plus qu'un caractère, le deuxième crochet s'efface (et cela est évidemment normal) et est remplacé par le deuxième caractère que l'utilisateur a entré.

    Je désirerais savoir comment est-il possible de faire en sorte que l'utilisateur puisse entrer UN SEUL caractère, et que, s'il en entre plusieurs, le caractère précédent qu'il a écrit est remplacé par le suivant, toujours à la même position, de façon à ne pas effacer le deuxième crochet.

    Merci,

    Respects,

    Array

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Pour cela, des fonctions telles que fgetc() ou scanf() ne sont pas adaptées. Il n'existe rien en C standard qui te permette de faire ce que tu veux. Pour faire des interfaces utilisateur évoluées en mode texte, je recommande d'utiliser la bibliothèque PDCurses.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut
    Pour cela, des fonctions telles que fgetc() ou scanf() ne sont pas adaptées. Il n'existe rien en C standard qui te permette de faire ce que tu veux. Pour faire des interfaces utilisateur évoluées en mode texte, je recommande d'utiliser la bibliothèque PDCurses.
    Par curiosité, s'il n'y a aucune fonction standard pour le faire, serait-il possible de le faire en pur C (je parle sans recourir à aucune bibliothèque non standard)?

    Parce que certaines personnes disent que le C est un langage d'assemblage portatif. Or, on peut faire le genre de truc que je veux en ASM...

    PS: Si non, vaut-il mieux utiliser ncurses que PDCurses sur les systèmes unix?

    Merci,

    Sincèrement,

    Array

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Sous unixoide, j'utilise ncurses. PDCurses est relativement compatible avec ncurses (mais pas 100% je crois) et a l'avantage de pouvoir être utilisée sous système unixoide (X11), sous Windows, etc.

    Il n'y a malheureusement aucune solution 100 % portable pour ton problème. L'utilisation de PDCurses ou ncurses me semble la plus adaptée. Toutefois, je ne pense pas que pour ton menu, PDCurses/ncurses soit absolument indispensable. Pourquoi veux-tu que le choix de l'utilisateur s'inscrive absolument dans une case? Pure cosmétique? Personnellement, pour implanter un menu de la sorte, j'essaie de faire au plus simple avec une solution à base de fgets() et des fonctions de conversions qui vont bien.

    Bien sûr, tout dépend des contraintes liées à ton application. Mais si ton but est d'apprendre à programmer, sache que la solution la plus simple est très souvent la meilleure.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #5
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par Array
    Par curiosité, s'il n'y a aucune fonction standard pour le faire, serait-il possible de le faire en pur C (je parle sans recourir à aucune bibliothèque non standard) ?

    Parce que certaines personnes disent que le C est un langage d'assemblage portatif. Or, on peut faire le genre de truc que je veux en ASM...
    Il n'y a rien que tu ne puisse faire en C étant donné qu'il s'agit justement d'un langage très proche de la machine. Tu peux recoder toute la bibliothèque standard (ou n'importe quelle autre) en partant de zéro si tu veux. Mais du moment que tu utilises une spécificité d'un système particulier, tu sors du cadre de la portabilité. Or de nombreuses opérations (comme les entrées/sorties par exemple) sont dépendantes du système. Pour faire des entrées/sorties en langage C, il faut à priori passer par les fonctinnalités de bas niveau de son système. La librairie standard fournit une interface portable de routines écrites en langage C mais dont l'implémentation peut évidemment dépendre du système. En mode réel 16 bits (x86) par exemple tu peux les interruptions du DOS (si t'es sous DOS) ou du BIOS (indépendant de l'OS), mais évidement ta fonction ne marchera que sur PC. Tout ce que t'as à faire donc c'est de coder une série d'intructions machines qui fait ce que tu souhaites et de pointer ces instructions à l'aide d'un pointeur de fonction, puis appeler cette fonction. Ca fait entrer en jeu pas mal de connaissances, je suppose que sais écrire des instructions en langage machine et que tu connais la convention d'appel du C.

  6. #6
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut
    Il n'y a rien que tu ne puisse faire en C étant donné qu'il s'agit justement d'un langage très proche de la machine. Tu peux recoder toute la bibliothèque standard (ou n'importe quelle autre) en partant de zéro si tu veux. Mais du moment que tu utilises une spécificité d'un système particulier, tu sors du cadre de la portabilité. Or de nombreuses opérations (comme les entrées/sorties par exemple) sont dépendantes du système. Pour faire des entrées/sorties en langage C, il faut à priori passer par les fonctinnalités de bas niveau de son système. La librairie standard fournit une interface portable de routines écrites en langage C mais dont l'implémentation peut évidemment dépendre du système. En mode réel 16 bits (x86) par exemple tu peux les interruptions du DOS (si t'es sous DOS) ou du BIOS (indépendant de l'OS), mais évidement ta fonction ne marchera que sur PC. Tout ce que t'as à faire donc c'est de coder une série d'intructions machines qui fait ce que tu souhaites et de pointer ces instructions à l'aide d'un pointeur de fonction, puis appeler cette fonction. Ca fait entrer en jeu pas mal de connaissances, je suppose que sais écrire des instructions en langage machine et que tu connais la convention d'appel du C.
    Il n'y a malheureusement aucune solution 100 % portable pour ton problème.

    C'est à des réponses similaires à celles-ci dont j'avais peur...
    Nah, coder en ASM pour moi est, pour l'instant, un grand mystère.
    Je comprends ce que vous dites.
    La seule solution est de manipuler les instructions spécifiques à une implémentation afin parvenir à mes fins, ce qui nécessiterait que je me renseigne sur toutes les implémentations, savoir les spécifités de celles-ci, etc.
    0 pour la portabilité, 100 pour la difficulté.
    C'est donc ainsi que GLIBC et MSVCRT sont conçues, en regroupant toutes les spécifités...

    Je me rabbaterai donc sur PDCurses.



    Pourquoi veux-tu que le choix de l'utilisateur s'inscrive absolument dans une case? Pure cosmétique?
    C'est que mon menu va s'agrandir énormément.
    Je crois que cela voudrais la peine.



    Mais si ton but est d'apprendre à programmer, sache que la solution la plus simple est très souvent la meilleure.
    Oui, je le sais, mais j'ai toujours eu tendance au perfectionnisme. Cependant, je n'exagère pas. De plus, cela me permet de m'améliorer, puisque je touche à plus de choses :]. Toutefois, j'admet que cela pourrait me jouer de mauvais tours, je vais donc tâcher d'agir avec modération.

  7. #7
    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 Array Voir le message
    Par curiosité, s'il n'y a aucune fonction standard pour le faire, serait-il possible de le faire en pur C (je parle sans recourir à aucune bibliothèque non standard)?
    Non. Le comportement de fgetc() (à la base des autres fonctions d'entrée standards) est suspensif et il attend un '\n' dans le flux. C'est la règle.

    http://emmanuel-delahaye.developpez.com/notes.htm#fgetc

    Parce que certaines personnes disent que le C est un langage d'assemblage portatif.
    Ce qui est portatif, c'est Windows et ses poignée (handles)... Le C est 'portable'.
    Or, on peut faire le genre de truc que je veux en ASM...
    Ah oui, ? Comment, ça m'intéresse. Et surtout sur quelle plateforme ?
    PS: Si non, vaut-il mieux utiliser ncurses que PDCurses sur les systèmes unix?
    Pour faire des choses simples, l'un ou l'autre suffisent. Ce qui est bien avec PDCurses, c'est qu'on ne sait faire que ce qui est portable...

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/10/2014, 18h46
  2. Réponses: 6
    Dernier message: 14/04/2014, 14h17
  3. Comportement de scanf sous Eclipse
    Par razily dans le forum Eclipse C & C++
    Réponses: 3
    Dernier message: 22/10/2009, 16h20
  4. Browser qui se comporte comme mozilla ou comme ie, etc.
    Par Bad_Lemon dans le forum Réseau
    Réponses: 5
    Dernier message: 25/04/2007, 07h54
  5. Documentation gratuite sur l'API Windows, COM, DCOM, OLE, etc.
    Par Community Management dans le forum Windows
    Réponses: 1
    Dernier message: 16/11/2006, 15h28

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