Free Pascal中读取首个句号前字符并终止循环的问题
Free Pascal 遇句号无法终止循环问题解决
问题背景
课程要求使用Free Pascal完成任务,禁止使用string、break等关键字,变量只能用char类型。需求是读取字符序列,仅处理首个.之前的所有字符(例如输入house.dog.时,只处理h、o、u、s、e),遇到.立即终止循环。但现有代码运行后无法停止,持续要求输入直到出现运行时错误。
错误代码
program testingw; var myText : char; myResult : Integer; begin writeLn ('enter your text'); readLn (myText); while myText <> '.' do begin Read(myText); if myText <> '.' then begin myResult := myResult * 125 + ord(myText); WriteLn (myText); end; end; { while } end.
错误原因
- 初始读取错误:
readLn(myText)会读取一整行直到换行符,但仅将该行最后一个字符赋值给myText。比如输入house.,myText会被设为换行符而非h,导致循环初始条件判断完全偏离预期。 - 循环逻辑颠倒:先执行
Read(myText)再判断字符是否为.,会跳过第一个有效字符;同时,由于readLn已经吃掉了第一行的换行符,后续Read会持续等待下一行输入,导致程序无法终止。 - 变量未初始化:
myResult未初始化为0,计算时会使用随机内存值,导致结果错误。
修正后的代码
program testingw; var myText : char; myResult : Integer; begin myResult := 0; { 初始化整数变量,避免随机值干扰计算 } writeLn('enter your text'); Read(myText); { 先读取第一个字符,作为循环初始判断依据 } while myText <> '.' do begin myResult := myResult * 125 + ord(myText); WriteLn(myText); Read(myText); { 读取下一个字符,准备下一次循环判断 } end; end.
代码说明
- 初始化变量:Free Pascal中未初始化的整数变量会保留内存中的随机值,必须将
myResult初始化为0才能保证计算逻辑正确。 - 调整读取顺序:先读取第一个字符再进入循环,确保第一个有效字符不会被跳过,同时能正确判断是否为
.。 - 循环内逻辑优化:先处理当前字符,再读取下一个字符,遇到
.时直接退出循环,完美匹配需求。 - 使用
Read而非readLn:Read会逐个读取输入字符,包括同一行内的所有字符,不会等待换行符,因此能正确识别同一行中的.并终止循环。
内容的提问来源于stack exchange,提问作者Varo
相关产品推荐
相关产品推荐

