Quitter en appuyant sur la touche entrée - C - Programmation
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 :
|
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 :
|
Merci c'était \n que je cherchais, le reste de l'example ctait juste pour donner une idée
merci
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
Marsh Posté le 31-10-2006 à 00:41:02
Emmanuel Delahaye a écrit : Le type retourné par getchar() est int. |
ça reste assez complexe pour mon niveau
enfin voilà le programme modifier
Code :
|
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);
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 ?
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. |
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 )
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 ?
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. |
conio pour le clrscr ? (j'avais déjà essayé de l'utiliser, mais en vain)
y'a le system("cls" ); pour nettoyer l'écran
Marsh Posté le 31-10-2006 à 16:22:03
ReplyMarsh 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.
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 ©.
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.
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
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'.
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 :
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)
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.
(ce qui montre d'ailleurs, même si c'est involontaire, qu'ils permettent aussi une meilleure lisibilité du code, contrairement aux nombres magiques...)
Marsh Posté le 01-11-2006 à 12:17:05
Emmanuel Delahaye a écrit : C'est le contraire :
|
le while (c != '\r'); marche impec , essayé et adopté
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
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 |
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 :
|
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
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
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