使用“ while not EoLn”以pascal读取多个字符

问题描述

我想要做的是连续读取字符并计算大写,小写,数字和空格中的字符数。 (被告知不要使用字符串)。

我的问题是,为什么此代码不起作用?是不是应该先读取第一个字符,然后读取第二个字符,直到输入的最后一个字符?

如何制作一个循环,该循环读取输入中的第一个字符,然后再读取输入的字符,依此类推...当看到行尾时,应停止循环。

program Contadordecaracteres;

VAR
  minusculas,mayusculas,numeros,espacios:integer;
  c:char;


begin
  minusculas:= 0;
  mayusculas:= 0;
  numeros:= 0;
  espacios:= 0;
  writeln('Escriba algo');
  while not EoLn do
  begin
  read(c);

  case c of
       ' ': espacios:= espacios+1;
       '0'..'9': numeros:= numeros+1;
       'A'..'Z': mayusculas:= mayusculas+1;
       'a'..'z': minusculas:= minusculas+1;

  end; //end of case
  end; // end of while

  writeln('Mayusculas: ',mayusculas);
  writeln('Minusculas: ',minusculas);
  writeln('Numeros: ',numeros);
  writeln('Espacios: ',espacios);
  readln;


end.

解决方法

如何制作一个循环以读取输入中的第一个字符,然后 在此之后读取字符,依此类推...当看到行尾时 它应该停止循环。

除一个细节外,您的程序实际上完成了您想要执行的操作。无法按您期望的那样工作的一个细节是,当您按 Enter (在此之前敲过各种键之后)时,程序会在writeln()和{ {1}},然后终止。我猜您希望程序会在此readln行处停止。

使用readln;语句,您需要用户按 Enter 来查看摘要。没关系。

while not EoLn do看到该按键产生的while not EoLn do(回车换行),并很满意退出循环,但并未从其中移除CR LF输入缓冲区

执行CR LF(在所有readln之后)后,它会在输入缓冲区中看到writeln,从缓冲区中读取并继续,从而导致程序结束

解决方法是在已经拥有的CR LF之后再添加一个readln;。然后程序将停止,直到您再次按 Enter