Pascal readkey似乎导致子QENT readln忽略为响应readln而键入的第一个字符。readln仅将第二个和更高的字符存储到var
我很难为情地承认,我无法理解为什么在这个非常简单的示例中,“else if”子句中的“readln(age);”语句忽略了为响应第16行周围的“writeln('你多大了',name:length(name),'?');”语句而输入的第一个整数 显然,罪魁祸首是第18行的“ch:=readkey;”语句。 要输入有效的年龄,必须先按下某个键(除了(ASCII 13),该键被“if ch=#13 then”语句捕获 “age”变量的类型是字符串还是整数似乎无关紧要 如果输入两个字符或整数,则只有第二个字符或整数存储在“age”变量中。例如,要输入年龄“25”,我必须先按键盘上的其他键,然后输入“25”表示“25”存储在“age”变量中 如果您能帮助理解这一点,我们将不胜感激。也许整个方法都不正确Pascal readkey似乎导致子QENT readln忽略为响应readln而键入的第一个字符。readln仅将第二个和更高的字符存储到var,pascal,Pascal,我很难为情地承认,我无法理解为什么在这个非常简单的示例中,“else if”子句中的“readln(age);”语句忽略了为响应第16行周围的“writeln('你多大了',name:length(name),'?');”语句而输入的第一个整数 显然,罪魁祸首是第18行的“ch:=readkey;”语句。 要输入有效的年龄,必须先按下某个键(除了(ASCII 13),该键被“if ch=#13 then”语句捕获 “age”变量的类型是字符串还是整数似乎无关紧要 如果输入两个字符或整数,则只有第
PROGRAM t5;
uses crt;
var
name,age : string;
ch : char;
procedure greet;
begin
clrscr;
writeln('What''s your name? ');
readln(name);
clrscr;
writeln('Hi, ',name:length(name));
writeln('How old are you ',name:length(name),'?');
ch := readkey;
if ch = #13 then
begin
writeln('Please enter a valid age!');
writeln ('You pressed the ','"','Enter','"',' key ','("',ord(ch),'")');
readln;
writeln('Bye!');
readln;
end
else if ch <> #13 then
begin
readln(age);
writeln('Gee, ',age,', - that''s really old!');
readln;
end;
end;
BEGIN
greet;
END.
程序t5;
使用阴极射线管;
变量
姓名、年龄:字符串;
ch:char;
程序问候;
开始
clrsc;
写(‘你叫什么名字?’);
readln(姓名);
clrsc;
writeln('Hi',名称:length(name));
writeln('你多大了',名字:length(名字),'?');
ch:=readkey;
如果ch=#13,则
开始
writeln('请输入有效年龄!');
writeln('您按了','','输入',','键','(“,ord(ch),”)));
readln;
写下(“再见!”);
readln;
结束
否则,如果第13章
开始
readln(年龄);
写着(‘哎呀,’,年龄,’,-那真是太老了!);
readln;
结束;
结束;
开始
打招呼
结束。
ReadKey()
从键盘缓冲区读取一个字符(并将其删除)
问题的顺序如下:
ch := ReadKey; // the first digit is now in `ch`
if ch = #13 then // this condition is false
...
else if ch <> #13 then // this condition is true
begin
readln(age) // user types the second digit and <Enter>
// then you use age, but you have omitted the first character which is in `ch`
end;
ch:=ReadKey;//第一个数字现在在'ch'中`
如果ch=#13,则//此条件为假
...
否则,如果第13章,则//此条件为真
开始
readln(age)//用户键入第二个数字并
//然后使用age,但省略了'ch'中的第一个字符`
结束;
相反,只使用
ReadLn()
并检查返回的字符是否是正确的数字。让我有点困惑的是,OP似乎理解了readkey
的功能,但当它这样做时,它会感到惊讶!但我想我们都太过接近一个问题,有时看不到它是什么。@MartynA我想OP不知道,或者确实知道不要考虑,<代码> Read键()从输入缓冲区中删除字符。我完全同意您的看法,即偶尔不会看到我们自己的错误。Readkey
读取单个键。因此,通过包含ch:=Readkey
,您的代码将完全按照您描述的方式运行,它似乎会忽略用户年龄的第一个字符。