Quitter en appuyant sur la touche entrée

Quitter en appuyant sur la touche entrée - C - Programmation

Marsh Posté le 30-10-2006 à 23:03:42    

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. }

Reply

Marsh Posté le 30-10-2006 à 23:03:42   

Reply

Marsh Posté le 30-10-2006 à 23:22:26    

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
Reply

Marsh Posté le 30-10-2006 à 23:35:33    

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 :)

Reply

Marsh Posté le 30-10-2006 à 23:36:32    

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/
Reply

Marsh Posté le 31-10-2006 à 00:41:02    

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
Reply

Marsh Posté le 31-10-2006 à 01:00:42    

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/
Reply

Marsh Posté le 31-10-2006 à 08:58:35    

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 ;))

Reply

Marsh Posté le 31-10-2006 à 10:03:03    

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/
Reply

Marsh Posté le 31-10-2006 à 12:34:23    

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

Reply

Marsh Posté le 31-10-2006 à 16:22:03    

Siluro a écrit :

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


 

$ cls
cls: Command not found.
$

Reply

Marsh Posté le 31-10-2006 à 16:22:03   

Reply

Marsh Posté le 31-10-2006 à 16:32:41    

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]

Reply

Marsh Posté le 31-10-2006 à 16:36:11    

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 ©.

Reply

Marsh Posté le 31-10-2006 à 19:00:53    

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.

Reply

Marsh Posté le 31-10-2006 à 19:45:21    

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
 
:)

Reply

Marsh Posté le 31-10-2006 à 20:25:23    

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

Reply

Marsh Posté le 01-11-2006 à 09:30:49    

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'.

Reply

Marsh Posté le 01-11-2006 à 09:57:32    

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/
Reply

Marsh Posté le 01-11-2006 à 09:59:39    

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...)

Reply

Marsh Posté le 01-11-2006 à 12:17:05    

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
Reply

Marsh Posté le 01-11-2006 à 12:21:00    

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

Reply

Marsh Posté le 01-11-2006 à 12:59:55    

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/
Reply

Marsh Posté le 04-11-2006 à 10:15:41    


 
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 :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed