Pascal删除字符串中长度超4的单词:Delphi代码失效求助
Delphi下Pascal代码无法删除长单词的问题修复
问题根源分析
你的代码在OnlineGDB能运行但在Delphi失效,主要是这几个原因:
- 范围越界错误:Delphi默认启用范围检查,当
i > length(UserString)时,访问UserString[i]会触发运行时错误;而OnlineGDB通常关闭了范围检查,不会报错。 - 逻辑判断颠倒:需求是删除长度超过4的单词,但代码里
if (i-n<3)的逻辑是保留长度≤3的单词,完全搞反了判断条件。 - 循环终止漏洞:如果输入字符串末尾没有点,
i会持续递增到超出字符串长度,直接触发越界。 - 索引调整混乱:删除操作后
i和n的赋值逻辑有问题,导致后续遍历的索引错位。
修复后的代码
VAR UserString: string; i, n, WordLen: Integer; BEGIN Writeln('Enter the string (end with .):'); Readln(UserString); i := 1; n := 1; while i <= Length(UserString) do begin // 定位单词结束的分隔符(空格或点) if (UserString[i] = ' ') or (UserString[i] = '.') then begin WordLen := i - n; // 删除长度超过4的单词(包含分隔符) if WordLen > 4 then begin Delete(UserString, n, i - n + 1); i := n - 1; n := i + 1; end else begin // 保留短单词,移动到下一个单词的起始位置 n := i + 1; end; end; // 遇到结尾的点,处理后直接退出循环 if UserString[i] = '.' then Break; Inc(i); end; Writeln('Result String: ', UserString); END.
修复说明
- 改用
while循环替代repeat-until,避免先执行再判断导致的越界风险。 - 明确计算单词长度
WordLen,将判断逻辑改为删除WordLen > 4的单词,完全匹配需求。 - 增加结尾点的判断,处理完成后直接退出循环,避免无效的索引递增。
- 调整删除后的索引逻辑,确保遍历不会因为字符串长度变化而错位。
- 将
byte类型替换为Integer,避免字符串长度超过255时的类型溢出问题。
内容的提问来源于stack exchange,提问作者nini33
相关产品推荐
相关产品推荐

