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 :

Scanf et "return key"


Sujet :

Bibliothèque standard C

  1. #1
    Membre régulier Avatar de Joccy
    Profil pro
    Inscrit en
    Août 2007
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 153
    Points : 81
    Points
    81
    Par défaut Scanf et "return key"
    Bonjour,

    je souhaite faire une pause dans un programme et attendre que l'utilisateur appuie sur la touche "enter" pour continuer.
    Bon, vous allez trouver ca simple mais ... comment faire pour vérifier que c'est bien la touche "enter" ?
    De plus, en utilisant scanf, la touche "enter" ne fait rien sauf si elle est précédée d'une autre touche (et je ne veux pas toujours ca)...
    Je suis sous Linux.

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je dirais, utiliser une boucle de getchar() à la place:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int purge(void)
    {
    	int c;
    	while((c=getchar())!='\n' && c!=EOF)
    	{}
    	return (c!=EOF ? 0 : -1);
    }
    Une fonction de ce genre va boucler jusqu'à ce que la touche "enter" soit pressée, puis retourner 0. De plus, à fin d'éviter une boucle infinie en cas de problème, elle retourne -1 en cas d'erreur.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre régulier Avatar de Joccy
    Profil pro
    Inscrit en
    Août 2007
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 153
    Points : 81
    Points
    81
    Par défaut
    J'etais justement en train d'essayer ca:
    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
     
    char c;
    char tabc[256] = {0};
    int i=0;
     
    while ((c = getchar()) != '\n' && c!=EOF)
    {
    	tabc[i] = c;
    	i++;
    	if (i == 255)
    	{
    		break;
    	}
    }    
     
    if (tabc[0] == '\n')
    {
    	printf("Return key was pressed.\n");
                 return NULL;
     
    }
    else
    {
    	printf("Keys == %s\n", tabc[0]);
    	return &tabc;
    }
    Malheureusement, je n'arrive pas à afficher ""Return key was pressed." !!
    Une idée?

    merci

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    C'est parce que normalement, tu n'as pas à tester spécifiquement [0].
    Le code que j'ai posté ignore toutes les touches jusqu'à pression de [Entrée].

    Souvent, on utilise ce code en conjonction avec fgets(), pour saisir une ligne de taille limitée et ignorer l'excédent:
    Code C : 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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #include <stdio.h>
    #include <string.h>
     
    int purge(void)
    {
    	int c;
    	while((c=getchar())!='\n' && c!=EOF)
    	{}
    	return (c!=EOF ? 0 : -1);
    }
     
    int clean(char *buf)
    {
    	/* Si le \n est dans le buffer, c'est que la ligne est complète
    	   sinon, c'est qu'elle était trop grande pour le buffer
    	   et que le \n est toujours dans le flux. */
    	int ret = 0;
    	char * pLF = strchr(buf, '\n');
    	if(pLF != NULL)
    	{
    		/* \n trouvé: On tronque la chaîne pour le virer. */
    		*pLF = '\0';
    	}
    	else
    	{
    		/* \n est toujours dans le flux */
    		ret = purge();
    	}
    	return ret;
    }
     
    #define TAILLE 20
     
    int main(void)
    {
    	char unBuffer[TAILLE];
    	int unEntier;
    	int scanned;
     
    	/* Utilisation de purge() avec scanf() */
    	puts("Taper un entier:");
    	scanned = scanf("%d", &unEntier);
    	purge();
    	if(scanned == 1)
    		printf("Vous avez tape: %d\n", unEntier);
    	else
    		puts("Mauvaise saisie");
     
    	/* Utilisation de clean(): fgets(), puis clean() immédiatement après */
    	puts("Taper une chaîne:");
    	fgets(unBuffer, TAILLE, stdin);
    	clean(unBuffer);
    	printf("Vous avez tape: '%s'\n", unBuffer);
     
    	/* Utilisation de purge() tout seul comme fonction d'attente */
    	puts("Presser [Entree] :");
    	purge();
    	puts("Bye bye!");
    	return 0;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre régulier Avatar de Joccy
    Profil pro
    Inscrit en
    Août 2007
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 153
    Points : 81
    Points
    81
    Par défaut
    C'est parce que normalement, tu n'as pas à tester spécifiquement [0].
    Le code que j'ai posté ignore toutes les touches jusqu'à pression de [Entrée].
    Ce que je recherche c'est
    - soit on presse "Enter" et on quitte,
    - soit on tape une ligne et ensuite on quitte: la fonction retourne alors ce qui a été tapé.
    En testant [0], c'est juste pour être sûre que je n'ai que "Enter", et savoir si je retourne la bonne valeur dans le cas contraire ...

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Dans ce cas, le mieux est de faire un fgets() + clean(), et voir si la ligne saisie est vide ou non...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre régulier Avatar de Joccy
    Profil pro
    Inscrit en
    Août 2007
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 153
    Points : 81
    Points
    81
    Par défaut
    Merci ca marche !

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

Discussions similaires

  1. Quote et double quote
    Par aktos dans le forum Langage
    Réponses: 8
    Dernier message: 05/01/2007, 19h55

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