3 votes

Pascal - impuretés de la fonction read/readln ?

Cela m'intéresse vraiment - pourquoi faut-il que vous mettiez

readln;

après avoir lu une valeur du clavier dans une variable ? Par exemple,

repeat
writeln('Make your choise');
read(CH);

if (CH = '1') then begin
writeln('1');
end;

{ ... }
until CH = 'q';

Si vous exécutez le code suivant et que vous appuyez sur la touche "1" du clavier, vous obtiendrez une sortie du type suivant

1
Make your choise
Make your choise
Make your choise

En revanche, si vous ajoutez la ligne "readln ;", tout fonctionne parfaitement :

repeat
writeln('Make your choise');
read(CH);
readln;

if (CH = '1') then begin
    Writeln('1');
end

until CH = 'q';

Je ne peux que supposer que le fait d'appeler readln sans arguments met fin au processus de lecture de l'entrée clavier. Mais si c'est le cas, pourquoi les fonctions read/readln ne peuvent-elles pas arrêter de lire les données elles-mêmes, pour éviter une telle maladresse ?

7voto

Sdaz MacSkibbons Points 6982

read lit un caractère, mais s'attend toujours à ce que l'on appuie sur Entrée avant de revenir, même s'il ne renvoie qu'un seul caractère. Vous appuyez sur Entrée après 1, et la console remplit le tampon du clavier d'un CR (ASCII 0xd) et un LF (ASCII 0xa). (Sur un système Linux/UNIX, Make your choise n'apparaîtra que deux fois, parce qu'UNIX n'utilise qu'un LF comme caractère de saut de ligne). Vous pouvez les voir en imprimant les valeurs des caractères reçus avec ord(CH) (iirc).

Le second programme extrait la combinaison CRLF de la mémoire tampon du clavier avec la commande suivante readln et le rejeter, de sorte qu'il se comporte de la manière que vous semblez souhaiter.

S'il s'agit d'un programme jetable, il suffit de le faire via readln et de résoudre le problème plus important sur lequel vous travaillez. S'il est destiné à la production, construisez une fonction d'entrée par le biais d'une boucle quelconque autour de readkey (qui revient immédiatement après un caractère).

Merci pour la nostalgie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X