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

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.

修复说明

  1. 改用while循环替代repeat-until,避免先执行再判断导致的越界风险。
  2. 明确计算单词长度WordLen,将判断逻辑改为删除WordLen > 4的单词,完全匹配需求。
  3. 增加结尾点的判断,处理完成后直接退出循环,避免无效的索引递增。
  4. 调整删除后的索引逻辑,确保遍历不会因为字符串长度变化而错位。
  5. 将byte类型替换为Integer,避免字符串长度超过255时的类型溢出问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:46:00