Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pascal readkey似乎导致子QENT readln忽略为响应readln而键入的第一个字符。readln仅将第二个和更高的字符存储到var_Pascal - Fatal编程技术网

Pascal readkey似乎导致子QENT readln忽略为响应readln而键入的第一个字符。readln仅将第二个和更高的字符存储到var

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”变量的类型是字符串还是整数似乎无关紧要 如果输入两个字符或整数,则只有第

我很难为情地承认,我无法理解为什么在这个非常简单的示例中,“else if”子句中的“readln(age);”语句忽略了为响应第16行周围的“writeln('你多大了',name:length(name),'?');”语句而输入的第一个整数

显然,罪魁祸首是第18行的“ch:=readkey;”语句。 要输入有效的年龄,必须先按下某个键(除了(ASCII 13),该键被“if ch=#13 then”语句捕获

“age”变量的类型是字符串还是整数似乎无关紧要

如果输入两个字符或整数,则只有第二个字符或整数存储在“age”变量中。例如,要输入年龄“25”,我必须先按键盘上的其他键,然后输入“25”表示“25”存储在“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
,您的代码将完全按照您描述的方式运行,它似乎会忽略用户年龄的第一个字符。