Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1358 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Quitter en appuyant sur la touche entrée

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Quitter en appuyant sur la touche entrée

n°1467855
exhortae
Membre du Cartel des Médecins
Posté le 30-10-2006 à 23:03:42  profilanswer
 

Bonjour
 
Voilà j'aurais aimé savoir comment faire pour que je sorte de la boucle à l'appui de la touche entrée (si c'est possible)
 
Merci
 

Code :
  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. char s;
  5. do
  6. {
  7. s = getchar();
  8. } while( 1 );
  9.     putchar(s);
  10. return 0;
  11.    
  12. }

mood
Publicité
Posté le 30-10-2006 à 23:03:42  profilanswer
 

n°1467871
fhr
Posté le 30-10-2006 à 23:22:26  profilanswer
 

Il faut quitter la boucle si tu fais entrée, ie si le caractère lu est '\n'. Le pb c'est qu' alors le dernier caractère lu est '\n', et putchar(s) affiche donc un retour à la ligne; j'imagine que c'est pas ce que tu veux. En utilisant 2 char, on a (je pense), ce que tu veux :  
 

Code :
  1. int main()
  2. {
  3.     char s,a;
  4.    
  5.     do
  6.     {
  7.          a=s;
  8.          s=getchar();
  9.     }while(s!='\n');
  10.    
  11.     putchar(a);
  12.     return 0;
  13. }

Message cité 1 fois
Message édité par fhr le 30-10-2006 à 23:29:25
n°1467875
exhortae
Membre du Cartel des Médecins
Posté le 30-10-2006 à 23:35:33  profilanswer
 

fhr a écrit :

Il faut quitter la boucle si tu fais entrée, ie si le caractère lu est '\n'. Le pb c'est qu' alors le dernier caractère lu est '\n', et putchar(s) affiche donc un retour à la ligne; j'imagine que c'est pas ce que tu veux. En utilisant 2 char, on a (je pense), ce que tu veux :  
 

Code :
  1. int main()
  2. {
  3.     char s,a;
  4.    
  5.     do
  6.     {
  7.          a=s;
  8.          s=getchar();
  9.     }while(s!='\n');
  10.    
  11.     putchar(a);
  12.     return 0;
  13. }



 
Merci c'était \n que je cherchais, le reste de l'example ctait juste pour donner une idée
 
merci :)

n°1467877
Emmanuel D​elahaye
C is a sharp tool
Posté le 30-10-2006 à 23:36:32  profilanswer
 

exhortae a écrit :

Voilà j'aurais aimé savoir comment faire pour que je sorte de la boucle à l'appui de la touche entrée (si c'est possible)


Le type retourné par getchar() est int.
 
getchar() ne fait pas ce que tu crois....
 
http://mapage.noos.fr/emdel/notes.htm#fgetc


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1467889
exhortae
Membre du Cartel des Médecins
Posté le 31-10-2006 à 00:41:02  profilanswer
 

Emmanuel Delahaye a écrit :

Le type retourné par getchar() est int.
 
getchar() ne fait pas ce que tu crois....
 
http://mapage.noos.fr/emdel/notes.htm#fgetc


 
 
ça reste assez complexe pour mon niveau :(
 
enfin voilà le programme modifier
 

Code :
  1. #include <stdio.h>
  2. #include <conio.h>
  3. int main(void)
  4. {
  5. char ch[121], c;
  6. int compteur = 0;
  7. clrscr();
  8. printf("Entrez une chaine de caracteres termine par $ : " );
  9. do
  10. {
  11. c = getch();
  12. ch[compteur] = c;
  13. compteur = compteur +1;
  14. } while (c != '$');
  15. ch[compteur - 1] = '\0';
  16. printf("\nVotre chaine est : " );
  17. puts(ch);
  18. getch();
  19. return 0;
  20. }


 
ce que je veux faire,
 
saisir une suite de caractère (sans avoir à taper entrée à chaque caractère) puis une fois que je taper la touche entrée la saisie s'arrête et la chaine saisie est affichée,
 
dans l'exemple ça marche si le caractère de sortie est $, par contre ça marche pas si le caractère de sortie est la touche entrée avec cette ligne } while (c != '\n);

Message cité 1 fois
Message édité par exhortae le 31-10-2006 à 08:59:50
n°1467894
Emmanuel D​elahaye
C is a sharp tool
Posté le 31-10-2006 à 01:00:42  profilanswer
 

exhortae a écrit :

ça reste assez complexe pour mon niveau :(


Une façon de dire que tu n'as rien pigé. OK.
 
Evite les accents dans le source, c'est illisibe. Pourquoi tu utilises <conio.h> ? Ce n'est pas portable. Tu ne devais pas utiliser getchar() au début ?


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1467933
exhortae
Membre du Cartel des Médecins
Posté le 31-10-2006 à 08:58:35  profilanswer
 

Emmanuel Delahaye a écrit :

Une façon de dire que tu n'as rien pigé. OK.
 
Evite les accents dans le source, c'est illisibe. Pourquoi tu utilises <conio.h> ? Ce n'est pas portable. Tu ne devais pas utiliser getchar() au début ?


 
Disons que getchar me paraît assez compliquer, et le simple fait de l'inclure à la place de getch() m'oblige à taper sur la touche entrée à chaque saisie de caractère, ce que je ne veux pas. ce que je cherche à faire c'est de saisir une chaine de caractères en pouvant effectuer un contrôle sur chaque caractère PENDANT la saisie (avec mes moyens qui sont limités ;))

n°1467979
Emmanuel D​elahaye
C is a sharp tool
Posté le 31-10-2006 à 10:03:03  profilanswer
 

exhortae a écrit :

Disons que getchar me paraît assez compliquer, et le simple fait de l'inclure à la place de getch() m'oblige à taper sur la touche entrée à chaque saisie de caractère, ce que je ne veux pas. ce que je cherche à faire c'est de saisir une chaine de caractères en pouvant effectuer un contrôle sur chaque caractère PENDANT la saisie (avec mes moyens qui sont limités ;))


OK. Il faut alors penser à gérer l'echo (putch()), la correction, (au minimum, la touche 'BACKSPACE' qui est '\b') et la fin de saisie, qui est CR, soir '\r'.
 
Et garde bien en tête que tout ceci n'est pas portable et ne fonctionne que sous DOS ou Windows en mode console. Est-ce bien raisonnable de passer du temps là-dessus ?
 
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1468131
Siluro
Posté le 31-10-2006 à 12:34:23  profilanswer
 

Emmanuel Delahaye a écrit :

Une façon de dire que tu n'as rien pigé. OK.
 
Evite les accents dans le source, c'est illisibe. Pourquoi tu utilises <conio.h> ? Ce n'est pas portable. Tu ne devais pas utiliser getchar() au début ?


conio pour le clrscr ? (j'avais déjà essayé de l'utiliser, mais en vain)
y'a le system("cls" ); pour nettoyer l'écran

n°1468311
Elmoricq
Modérateur
Posté le 31-10-2006 à 16:22:03  profilanswer
 

Siluro a écrit :

y'a le system("cls" ); pour nettoyer l'écran


 

$ cls
cls: Command not found.
$

mood
Publicité
Posté le 31-10-2006 à 16:22:03  profilanswer
 

n°1468328
Siluro
Posté le 31-10-2006 à 16:32:41  profilanswer
 

C'était pour l'auteur.
Il code sous windows. Le "cls" était là pour remplacer l'utilisation de clrscr et donc éviter d'utiliser conio.h.  [:b-rabbit]

n°1468332
Elmoricq
Modérateur
Posté le 31-10-2006 à 16:36:11  profilanswer
 

Le problème de la bibliothèque conio étant qu'elle n'est pas portable, je ne suis pas sûr que la remplacer par system() soit vraiment un plus. ;)
 
De toute façon, on n'efface pas un terminal. C'est Mal ©.

n°1468435
yartempion
Posté le 31-10-2006 à 19:00:53  profilanswer
 

Pourquoi ne pas lui conseiller de passer par la  prise en main du terminal par termios.h en passant en mode non canonique si ça fonctionne sous windows. Il est vraie que sous windows il y a une fonction qui peut faire de la saisie caractere par caractere mais jene sais pas si pour la touche entree ca march car sous windows cette touche envoie peut etre deux caracteres a la fois le retour chariot CR code ascii 10 et ligne  suivante LF code ascii 13. Tu devrais essaye de voir le quel de ces deux codes est envoye en premier et comparer ta lecture a l'un des deux pour sortir de ton prog.

n°1468453
exhortae
Membre du Cartel des Médecins
Posté le 31-10-2006 à 19:45:21  profilanswer
 

yartempion a écrit :

Pourquoi ne pas lui conseiller de passer par la  prise en main du terminal par termios.h en passant en mode non canonique si ça fonctionne sous windows. Il est vraie que sous windows il y a une fonction qui peut faire de la saisie caractere par caractere mais jene sais pas si pour la touche entree ca march car sous windows cette touche envoie peut etre deux caracteres a la fois le retour chariot CR code ascii 10 et ligne  suivante LF code ascii 13. Tu devrais essaye de voir le quel de ces deux codes est envoye en premier et comparer ta lecture a l'un des deux pour sortir de ton prog.


 
 
Merci, le code ascii de la touche entrée était de 13, suffisait donc de mettre while ( c != 13); et c'est bon
 
:)

n°1468468
yartempion
Posté le 31-10-2006 à 20:25:23  profilanswer
 

Pour une fois que je peut aider y'a pas de quoi.

n°1468565
Elmoricq
Modérateur
Posté le 01-11-2006 à 09:30:49  profilanswer
 

yartempion a écrit :

Pourquoi ne pas lui conseiller de passer par la  prise en main du terminal par termios.h en passant en mode non canonique si ça fonctionne sous windows. Il est vraie que sous windows il y a une fonction qui peut faire de la saisie caractere par caractere mais jene sais pas si pour la touche entree ca march car sous windows cette touche envoie peut etre deux caracteres a la fois le retour chariot CR code ascii 10 et ligne  suivante LF code ascii 13. Tu devrais essaye de voir le quel de ces deux codes est envoye en premier et comparer ta lecture a l'un des deux pour sortir de ton prog.


 
Non. Si le C compte les \r (retour chariot) et \n (saut de ligne), c'est pas pour le seul plaisir d'inventer des signes idiots qui ne serviraient à rien. C'est tout simplement que si 10 et 13 correspondent bien à \r et \n sous Windows, ce n'est pas le cas ailleurs.
 
Donc, au lieu d'écrire c != 13, il faut écrire c != '\n'.

n°1468573
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-11-2006 à 09:57:32  profilanswer
 

Elmoricq a écrit :

C'est tout simplement que si 10 et 13 correspondent bien à \r et \n sous Windows, ce n'est pas le cas ailleurs.


C'est le contraire :
 

  • '\n'  = "New line" = "Line Feed" = LF = 10
  • '\r' = "carriage Return" = "Carriage Return" = CR = 13  


Citation :

Donc, au lieu d'écrire c != 13, il faut écrire c != '\n'.


Tu veux dire "au lieu d'écrire c != 13, il faut écrire c != '\r'"
 
Ce qui est vrai si on utilise un fonction de lecture directe comme getch(). (CONIO)

Message cité 1 fois
Message édité par Emmanuel Delahaye le 01-11-2006 à 10:00:29

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1468577
Elmoricq
Modérateur
Posté le 01-11-2006 à 09:59:39  profilanswer
 

J'ai surement mélangé les deux, je n'ai pas l'habitude d'associer ces signes à leur équivalent ASCII. [:dawa]
 
(ce qui montre d'ailleurs, même si c'est involontaire, qu'ils permettent aussi une meilleure lisibilité du code, contrairement aux nombres magiques...)

n°1468621
exhortae
Membre du Cartel des Médecins
Posté le 01-11-2006 à 12:17:05  profilanswer
 

Emmanuel Delahaye a écrit :

C'est le contraire :
 

  • '\n'  = "New line" = "Line Feed" = LF = 10
  • '\r' = "carriage Return" = "Carriage Return" = CR = 13  


Citation :

Donc, au lieu d'écrire c != 13, il faut écrire c != '\n'.


Tu veux dire "au lieu d'écrire c != 13, il faut écrire c != '\r'"
 
Ce qui est vrai si on utilise un fonction de lecture directe comme getch(). (CONIO)


 
le while (c != '\r'); marche impec , essayé et adopté
 
 :jap:


Message édité par exhortae le 01-11-2006 à 12:18:36
n°1468623
exhortae
Membre du Cartel des Médecins
Posté le 01-11-2006 à 12:21:00  profilanswer
 

Pour voir si j'ai bien saisi, quand je tape sur entrée, ce sont 2 caractères qui sont saisis le CR puis le LF
 
le CR permet de revenir à la ligne , et le LF permet d'effacer cette ligne??
 
c'est bien ça

n°1468634
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-11-2006 à 12:59:55  profilanswer
 

exhortae a écrit :

Pour voir si j'ai bien saisi, quand je tape sur entrée, ce sont 2 caractères qui sont saisis le CR puis le LF
 
le CR permet de revenir à la ligne , et le LF permet d'effacer cette ligne??
 
c'est bien ça


Non. Le clavier envoi un 'scancode' (numéro de touche) au PC qui le convertit en CR (code 13). La fonction getch() permet de récupérer cette valeur.
 
Il n'y a qu'une valeur.  
 
Sur les périphériques de sortie ASCII (imprimante, console), CR est une commande de retour chariot et LF une commande de saut de ligne.
 
Si on utilise l'écriture directe à l'écran (putch() de CONIO), il faut effectivement envoyer ces 2 commandes :  

Code :
  1. putch('\r');
  2.    putch('\n');


pour effectuer un retour à la ligne complet.
 
Si ,on utilise stdout, le caractère '\n' est interprété comme une séquence CRLF à l'écran et CR ou LF ou CRLF (ou LFCR, je ne sais plus) dans un fichier texte, en fonction du système.
 
http://mapage.noos.fr/emdel/notes.htm#fichiers

Message cité 1 fois
Message édité par Emmanuel Delahaye le 01-11-2006 à 13:01:49

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1470477
exhortae
Membre du Cartel des Médecins
Posté le 04-11-2006 à 10:15:41  profilanswer
 


 
Très bon ce lien merci, soit d'y en passant je viens de recevoir le langage c de ritchie, jvais pouvoir partir sur des bases un peu plus saines que cque j'ai fait avant :)

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Quitter en appuyant sur la touche entrée

 

Sujets relatifs
Ouvrir etat pour une semaine donnee a partir d'une date entree form[C] Lecture du code d'une touche appuyée
Afficher une entrée depuis un csv[résolu]Argument en entrée
Bouton quittervalider en pressant sur une touche du clavier.
Javascript : détecter la touche F2Modifier l'action d'une touche clavier
Tableau double entréeProbleme avec la touche espace
Plus de sujets relatifs à : Quitter en appuyant sur la touche entrée


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR