You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pascal程序中read(s2)未触发输入请求问题求助

问题原因分析

你的问题核心出在Pascal中read()函数的输入处理逻辑上:

  • read(s)读取字符串时,会自动跳过前导空白字符(包括换行、空格、制表符),并且读取到下一个空白字符为止。
  • 当你输入12:25并按下回车后,read(s1)会把12:25全部读入(因为字符串里没有空白),此时输入缓冲区里还残留着一个换行符。
  • 接下来的read(s2)会自动跳过这个换行符,本应等待你输入内容,但可能在你的运行环境中,程序执行到write步骤时直接输出结果,导致你误以为没有触发等待;或者如果输入是一次性提交的,s2会被读入空字符串,程序直接继续执行输出流程。

另外,你的代码里还有个潜在的切片问题:如果s1是12:25,s1[1:3](以Free Pascal的1..3语法为例)会取到12:,StrtoInt处理这个非纯数字字符串会报错,但你程序输出了1225,说明你实际需要的是前两位小时和后两位分钟,建议把切片修正为s1[1..2]和s1[4..5]。

解决方法

有两种简单的修复方式:

方法1:用readln代替read读取输入

readln()会读取一整行输入(直到换行符),并且自动丢弃换行符,确保每次读取都是完整的一行,不会留下缓冲区残留:

var s1, s2: string; h1, m1: integer; 
begin 
  readln(s1); 
  h1 := StrtoInt(s1[1..2]); 
  m1 := StrtoInt(s1[4..5]); 
  readln(s2); // 这里会明确等待你输入第二行内容
  write(h1, m1); 
end.

方法2:在read(s1)后清空输入缓冲区

如果坚持使用read,可以在读取s1后用readln()吃掉剩余的换行符,确保后续的read(s2)能正常等待新输入:

var s1, s2: string; h1, m1: integer; 
begin 
  read(s1); 
  readln; // 清空输入缓冲区里的换行符
  h1 := StrtoInt(s1[1..2]); 
  m1 := StrtoInt(s1[4..5]); 
  read(s2); // 现在会正常等待你输入s2的内容
  write(h1, m1); 
end.

测试时,输入12:25后按回车,程序会等待你输入s2的内容,输入完成后再输出1225,符合你的预期流程。

内容的提问来源于stack exchange,提问作者Qwinty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:25:04