Quand je lance le programme et que je tape :
- sur la touche "1"
- puis sur la touche "2"
- puis sur la touche "retour en arrière"
- puis sur la touche "ENTER"
Je m'attends à ce que s'affiche : 12b. Mais en fait, seul "1" s'affiche.
Je ne comprends pas pourquoi b n'est pas apparu. Avez-vous une explication
à me donner ?
Comment corriger le code ?
Quand je lance le programme et que je tape :
- sur la touche "1"
- puis sur la touche "2"
- puis sur la touche "retour en arrière"
- puis sur la touche "ENTER"
Je m'attends à ce que s'affiche : 12b. Mais en fait, seul "1" s'affiche.
Je ne comprends pas pourquoi b n'est pas apparu. Avez-vous une explication
à me donner ?
Comment corriger le code ?
Quand je lance le programme et que je tape :
- sur la touche "1"
- puis sur la touche "2"
- puis sur la touche "retour en arrière"
- puis sur la touche "ENTER"
Je m'attends à ce que s'affiche : 12b. Mais en fait, seul "1" s'affiche.
Je ne comprends pas pourquoi b n'est pas apparu. Avez-vous une explication
à me donner ?
Comment corriger le code ?
Francois writes:Quand je lance le programme et que je tape :
- sur la touche "1"
- puis sur la touche "2"
- puis sur la touche "retour en arrière"
- puis sur la touche "ENTER"
Je m'attends à ce que s'affiche : 12b. Mais en fait, seul "1" s'affiche.
Je ne comprends pas pourquoi b n'est pas apparu. Avez-vous une explication
à me donner ?
Le plus probable est que le retour en arriere soit gere par le driver de
terminal (ou ou le terminal lui-meme si tu es reellement dans une
configuration digne de K&R1 :-)) et donc que ton code ne le voit jamais.Comment corriger le code ?
Je ne crois pas qu'il soit a corriger, meme si je ne l'aurais pas ecrit
ainsi. (J'aurais utilise un switch ou des else -- et donc pas de condition
redondante difficile a maintenir).
Francois <mathsattacks@free.fr> writes:
Quand je lance le programme et que je tape :
- sur la touche "1"
- puis sur la touche "2"
- puis sur la touche "retour en arrière"
- puis sur la touche "ENTER"
Je m'attends à ce que s'affiche : 12b. Mais en fait, seul "1" s'affiche.
Je ne comprends pas pourquoi b n'est pas apparu. Avez-vous une explication
à me donner ?
Le plus probable est que le retour en arriere soit gere par le driver de
terminal (ou ou le terminal lui-meme si tu es reellement dans une
configuration digne de K&R1 :-)) et donc que ton code ne le voit jamais.
Comment corriger le code ?
Je ne crois pas qu'il soit a corriger, meme si je ne l'aurais pas ecrit
ainsi. (J'aurais utilise un switch ou des else -- et donc pas de condition
redondante difficile a maintenir).
Francois writes:Quand je lance le programme et que je tape :
- sur la touche "1"
- puis sur la touche "2"
- puis sur la touche "retour en arrière"
- puis sur la touche "ENTER"
Je m'attends à ce que s'affiche : 12b. Mais en fait, seul "1" s'affiche.
Je ne comprends pas pourquoi b n'est pas apparu. Avez-vous une explication
à me donner ?
Le plus probable est que le retour en arriere soit gere par le driver de
terminal (ou ou le terminal lui-meme si tu es reellement dans une
configuration digne de K&R1 :-)) et donc que ton code ne le voit jamais.Comment corriger le code ?
Je ne crois pas qu'il soit a corriger, meme si je ne l'aurais pas ecrit
ainsi. (J'aurais utilise un switch ou des else -- et donc pas de condition
redondante difficile a maintenir).
J'oubliais: - il n'est pas sur que le retour en arriere envoie un b, chez
moi ca envoie un DEL. Utilise donc plutot CTRL-H meme si il est probable
que ma premiere explication soit la bonne.
- pour tester ton code, il faut soit mettre le driver de terminal dans un
mode ou il ne tente pas de traiter ce caractere... sans pour autant
empecher de notifier la fin de fichier. Je n'ai aucune idee de comment
faire sous Windows, sous Unix stty sert a gerer cela.
stty erase ^@
devrait desactiver la gestion du BS.
J'oubliais: - il n'est pas sur que le retour en arriere envoie un b, chez
moi ca envoie un DEL. Utilise donc plutot CTRL-H meme si il est probable
que ma premiere explication soit la bonne.
- pour tester ton code, il faut soit mettre le driver de terminal dans un
mode ou il ne tente pas de traiter ce caractere... sans pour autant
empecher de notifier la fin de fichier. Je n'ai aucune idee de comment
faire sous Windows, sous Unix stty sert a gerer cela.
stty erase ^@
devrait desactiver la gestion du BS.
J'oubliais: - il n'est pas sur que le retour en arriere envoie un b, chez
moi ca envoie un DEL. Utilise donc plutot CTRL-H meme si il est probable
que ma premiere explication soit la bonne.
- pour tester ton code, il faut soit mettre le driver de terminal dans un
mode ou il ne tente pas de traiter ce caractere... sans pour autant
empecher de notifier la fin de fichier. Je n'ai aucune idee de comment
faire sous Windows, sous Unix stty sert a gerer cela.
stty erase ^@
devrait desactiver la gestion du BS.
PS : au fait, dans mon code initial, j'ai l'impression qu'il y a une
erreur. C'est "&&" qu'il faut mettre au lieu de "&". Pourtant le
compilateur n'avait rien dit ?
PS : au fait, dans mon code initial, j'ai l'impression qu'il y a une
erreur. C'est "&&" qu'il faut mettre au lieu de "&". Pourtant le
compilateur n'avait rien dit ?
PS : au fait, dans mon code initial, j'ai l'impression qu'il y a une
erreur. C'est "&&" qu'il faut mettre au lieu de "&". Pourtant le
compilateur n'avait rien dit ?
Francois writes:PS : au fait, dans mon code initial, j'ai l'impression qu'il y a une
erreur. C'est "&&" qu'il faut mettre au lieu de "&". Pourtant le
compilateur n'avait rien dit ?
Tu auras une reponse pour le reste quand j'aurais le temps de l'ecrire.
Comme tu ne passais que des 0 et des 1 (le resultat des operateurs de
comparaison est garanti etre 0 ou 1), ca ne change pas grand chose dans ton
cas.
Francois <mathsattacks@free.fr> writes:
PS : au fait, dans mon code initial, j'ai l'impression qu'il y a une
erreur. C'est "&&" qu'il faut mettre au lieu de "&". Pourtant le
compilateur n'avait rien dit ?
Tu auras une reponse pour le reste quand j'aurais le temps de l'ecrire.
Comme tu ne passais que des 0 et des 1 (le resultat des operateurs de
comparaison est garanti etre 0 ou 1), ca ne change pas grand chose dans ton
cas.
Francois writes:PS : au fait, dans mon code initial, j'ai l'impression qu'il y a une
erreur. C'est "&&" qu'il faut mettre au lieu de "&". Pourtant le
compilateur n'avait rien dit ?
Tu auras une reponse pour le reste quand j'aurais le temps de l'ecrire.
Comme tu ne passais que des 0 et des 1 (le resultat des operateurs de
comparaison est garanti etre 0 ou 1), ca ne change pas grand chose dans ton
cas.
Alors effectivement, j'arrive à faire apparaître les caractères "" et
"b" en sortie grâce à CTRL-H lorsque quand je tape sur :
- A
- B
- CTRL-H
- puis enfin sur ENTER
Dans ce cas j'ai bien en sortie ABb.
Mais par contre, le truc
bizarre, c'est qu'au moment où je tape la suite de touche énumérée
ci-dessus, l'écran m'affiche "AB^H" et non comme j'imaginais "A" où
le B aurait été effacé par le CTRL-H. Autrement dit, le CRTL-H ne
remplit pas la fonction de "retour en arrière" (celle qui efface
la lettre avant le curseur).
Quand je fais ça, lorsque j'appuie sur la touche "retour en arrière"
sur l'écran il s'affiche "^?",
Tout ça pour dire que, pour l'instant, le seul moyen que j'ai pu
trouver pour afficher "b" en sortie avec le programme, c'est de
taper CTRL-H qui ne remplit pas la fonction de retour en arrière
mais qui affiche "^H" ?
Je ne suis pas sûr de bien comprendre par rapport à mon terminal. Vous
voulez dire que la touche retour en arrière est "particulière" pour
mon terminal dans le sens où il n'envoie pas le caractère retour en
arrière en sortie, par contre il efface bien le caractère précédent,
si bien que dans le flux de sortie nulle trace du caractères retour
en arrière. C'est bien cela ?
Alors effectivement, j'arrive à faire apparaître les caractères "" et
"b" en sortie grâce à CTRL-H lorsque quand je tape sur :
- A
- B
- CTRL-H
- puis enfin sur ENTER
Dans ce cas j'ai bien en sortie ABb.
Mais par contre, le truc
bizarre, c'est qu'au moment où je tape la suite de touche énumérée
ci-dessus, l'écran m'affiche "AB^H" et non comme j'imaginais "A" où
le B aurait été effacé par le CTRL-H. Autrement dit, le CRTL-H ne
remplit pas la fonction de "retour en arrière" (celle qui efface
la lettre avant le curseur).
Quand je fais ça, lorsque j'appuie sur la touche "retour en arrière"
sur l'écran il s'affiche "^?",
Tout ça pour dire que, pour l'instant, le seul moyen que j'ai pu
trouver pour afficher "b" en sortie avec le programme, c'est de
taper CTRL-H qui ne remplit pas la fonction de retour en arrière
mais qui affiche "^H" ?
Je ne suis pas sûr de bien comprendre par rapport à mon terminal. Vous
voulez dire que la touche retour en arrière est "particulière" pour
mon terminal dans le sens où il n'envoie pas le caractère retour en
arrière en sortie, par contre il efface bien le caractère précédent,
si bien que dans le flux de sortie nulle trace du caractères retour
en arrière. C'est bien cela ?
Alors effectivement, j'arrive à faire apparaître les caractères "" et
"b" en sortie grâce à CTRL-H lorsque quand je tape sur :
- A
- B
- CTRL-H
- puis enfin sur ENTER
Dans ce cas j'ai bien en sortie ABb.
Mais par contre, le truc
bizarre, c'est qu'au moment où je tape la suite de touche énumérée
ci-dessus, l'écran m'affiche "AB^H" et non comme j'imaginais "A" où
le B aurait été effacé par le CTRL-H. Autrement dit, le CRTL-H ne
remplit pas la fonction de "retour en arrière" (celle qui efface
la lettre avant le curseur).
Quand je fais ça, lorsque j'appuie sur la touche "retour en arrière"
sur l'écran il s'affiche "^?",
Tout ça pour dire que, pour l'instant, le seul moyen que j'ai pu
trouver pour afficher "b" en sortie avec le programme, c'est de
taper CTRL-H qui ne remplit pas la fonction de retour en arrière
mais qui affiche "^H" ?
Je ne suis pas sûr de bien comprendre par rapport à mon terminal. Vous
voulez dire que la touche retour en arrière est "particulière" pour
mon terminal dans le sens où il n'envoie pas le caractère retour en
arrière en sortie, par contre il efface bien le caractère précédent,
si bien que dans le flux de sortie nulle trace du caractères retour
en arrière. C'est bien cela ?
Ce que je veux dire, c'est que ce comportement que tu observes est en dehors
du domaine d'action du langage C
ici la norme se borne à dire que
l'émission de ce caractère 'b' via *putc() est sensée déplacer le «
curseur » sur le caractère précédent ; et ne précise rien sur le
comportement en entrée [fonctions *getc()] ; ce qui est tu l'avoueras
extrêmement réduit.
En fonction des caractéristiques de ton compilateur (gcc+glibc pour toi, et
peut-être aussi des normes Posix ou X/Open propres à ton environnement) tu
pourrais avoir plus de garanties dans un sens ou un autre, mais là je suis
incapable de savoir te renseigner plus, désolé.
^? est la manière la plus habituelle pour un pilote de terminal (au sens
ci-dessus) de représenter le caractère DEL, dont le code est 127. Autrement
dit, ton terminal considère que la touche retour arrière est liée au
caractère 127, pas au caractère b (qui a le code 8 pour ton
implémentation).
Voilà. J'ai tendance à penser qu'il y a comme un défaut au niveau de la
conformité à la norme avec ta configuration, mais
1) ce n'est pas grave
2) je n'en suis pas sûr
3) sachant que ta configuration est (probablement) un standard Unix, je
doute qu'il soit possible d'y remédier autrement qu'au niveau local en
changeant les paramètres de ta configuration.
Voilà. Note bien que « retour en arrière » (ou « déplacement à gauche » pour
nous autres qui écrivons de gauche à droite) est une fonction différente de
« effacement du dernier caractère », même si les terminaux à écran auxquels
nous sommes tant habitués cela semble similaire.
Ce que je veux dire, c'est que ce comportement que tu observes est en dehors
du domaine d'action du langage C
ici la norme se borne à dire que
l'émission de ce caractère 'b' via *putc() est sensée déplacer le «
curseur » sur le caractère précédent ; et ne précise rien sur le
comportement en entrée [fonctions *getc()] ; ce qui est tu l'avoueras
extrêmement réduit.
En fonction des caractéristiques de ton compilateur (gcc+glibc pour toi, et
peut-être aussi des normes Posix ou X/Open propres à ton environnement) tu
pourrais avoir plus de garanties dans un sens ou un autre, mais là je suis
incapable de savoir te renseigner plus, désolé.
^? est la manière la plus habituelle pour un pilote de terminal (au sens
ci-dessus) de représenter le caractère DEL, dont le code est 127. Autrement
dit, ton terminal considère que la touche retour arrière est liée au
caractère 127, pas au caractère b (qui a le code 8 pour ton
implémentation).
Voilà. J'ai tendance à penser qu'il y a comme un défaut au niveau de la
conformité à la norme avec ta configuration, mais
1) ce n'est pas grave
2) je n'en suis pas sûr
3) sachant que ta configuration est (probablement) un standard Unix, je
doute qu'il soit possible d'y remédier autrement qu'au niveau local en
changeant les paramètres de ta configuration.
Voilà. Note bien que « retour en arrière » (ou « déplacement à gauche » pour
nous autres qui écrivons de gauche à droite) est une fonction différente de
« effacement du dernier caractère », même si les terminaux à écran auxquels
nous sommes tant habitués cela semble similaire.
Ce que je veux dire, c'est que ce comportement que tu observes est en dehors
du domaine d'action du langage C
ici la norme se borne à dire que
l'émission de ce caractère 'b' via *putc() est sensée déplacer le «
curseur » sur le caractère précédent ; et ne précise rien sur le
comportement en entrée [fonctions *getc()] ; ce qui est tu l'avoueras
extrêmement réduit.
En fonction des caractéristiques de ton compilateur (gcc+glibc pour toi, et
peut-être aussi des normes Posix ou X/Open propres à ton environnement) tu
pourrais avoir plus de garanties dans un sens ou un autre, mais là je suis
incapable de savoir te renseigner plus, désolé.
^? est la manière la plus habituelle pour un pilote de terminal (au sens
ci-dessus) de représenter le caractère DEL, dont le code est 127. Autrement
dit, ton terminal considère que la touche retour arrière est liée au
caractère 127, pas au caractère b (qui a le code 8 pour ton
implémentation).
Voilà. J'ai tendance à penser qu'il y a comme un défaut au niveau de la
conformité à la norme avec ta configuration, mais
1) ce n'est pas grave
2) je n'en suis pas sûr
3) sachant que ta configuration est (probablement) un standard Unix, je
doute qu'il soit possible d'y remédier autrement qu'au niveau local en
changeant les paramètres de ta configuration.
Voilà. Note bien que « retour en arrière » (ou « déplacement à gauche » pour
nous autres qui écrivons de gauche à droite) est une fonction différente de
« effacement du dernier caractère », même si les terminaux à écran auxquels
nous sommes tant habitués cela semble similaire.
[confusion DEL, BS, et terminaux dans le cadre de l'apprentissage du C]
[confusion DEL, BS, et terminaux dans le cadre de l'apprentissage du C]
[confusion DEL, BS, et terminaux dans le cadre de l'apprentissage du C]