String 删除Pascal字符串中的短单词

String 删除Pascal字符串中的短单词,string,delphi,pascal,lazarus,freepascal,String,Delphi,Pascal,Lazarus,Freepascal,我需要删除以点结尾的字符串中的短单词(短于三个符号)。然后显示不带这些单词的字符串 所以我们需要一个用户的字符串作为输入,比如:“这是一个人键入的简单字符串。”在这个字符串中,程序应该删除每个短于三个符号的单词。在我们的字符串中,这些是:“is,a,a”。所以输出应该是“这个简单的字符串类型” 这是我编程课程的Pascal/Delphi任务 我已经思考这个简单的问题好几天了,显然已经没有办法解决这个问题并寻求你的帮助。我尝试了不同的循环,主要部分是在空间之间找到少于三个符号的序列。我尝试调试它有

我需要删除以点结尾的字符串中的短单词(短于三个符号)。然后显示不带这些单词的字符串

所以我们需要一个用户的字符串作为输入,比如:“这是一个人键入的简单字符串。”在这个字符串中,程序应该删除每个短于三个符号的单词。在我们的字符串中,这些是:“is,a,a”。所以输出应该是“这个简单的字符串类型”

这是我编程课程的Pascal/Delphi任务

我已经思考这个简单的问题好几天了,显然已经没有办法解决这个问题并寻求你的帮助。我尝试了不同的循环,主要部分是在空间之间找到少于三个符号的序列。我尝试调试它有相当一段时间,但没有结果

我使用1.6.2、FPC 3.0和MacOSX v10.11(El Capitan)。我的代码如下:

 VAR
   UserString: string;
   i, n: byte;    // Counters for the symbols in the string. 'i' counts every symbol.
   again: boolean;   // In case we need to repeat the program again
   UserAnswerRepeat: char;
   label repeat_again;

 BEGIN
   again:=false;
 repeat_again:                 // Label to repeat the program
   Writeln('Enter your string (ended by a dot):');
   Readln(UserString);

   // MAIN LOOP:
   n:=1;              // 'n' counts symbols in the words
   for i:=1 to length(UserString) do
   begin
     while (UserString[i] <> ' ') do inc(n); // Here I have Range Check Error. Don't know how to get rid of it.
     if (UserString[n] <> ' ') and (n<3) then
     begin
       delete(UserString, i-n, n);
       n:=1
     end;
   end;

   Writeln('The result is: ', UserString);

   Writeln('Do you want to repeat the program? (Y/N)');
   Readln(UserAnswerRepeat);
   if (UserAnswerRepeat = 'Y') or (UserAnswerRepeat = 'y')  then
     again:=true;
   if (again = true) then
     goto repeat_again;
 END.
VAR
UserString:string;
i、 n:字节;//字符串中符号的计数器。'我数每一个符号。
再次说明:布尔;//以防我们需要再次重复该程序
UserAnswerRepeat:char;
再次贴上标签;
开始
再次:=假;
再次重复\//Label以重复程序
Writeln('输入字符串(以点结尾):');
Readln(用户字符串);
//主回路:
n:=1;//'n'计算单词中的符号
对于i:=1到长度(UserString)do
开始
while(UserString[i]“”)do inc(n);//这里有一个范围检查错误。我不知道如何摆脱它。

if(UserString[n]'')和(nA
for
控制变量的循环开始值和结束值只计算一次。您将结束值设置为字符串的长度。但是,在循环过程中,您从字符串中删除了部分,因此结束值超过了字符串的结束值。请尝试使用
while
循环或
重复..直到
循环

错误的实际原因在下面的行中

  while (UserString[i] <> ' ') do inc(n);
while(UserString[i]“”)do inc(n);
循环会持续多久?循环的终点是什么


您还需要重新考虑如何使用
n
A
for
循环计算字符。控制变量的起始值和结束值只计算一次。您将结束值设置为字符串的长度。但是,在循环过程中,您从字符串中删除了部分,因此结束值超过了字符串的结束值。尝试使用
while
循环或
重复..直到
循环

错误的实际原因在下面的行中

  while (UserString[i] <> ' ') do inc(n);
while(UserString[i]“”)do inc(n);
循环会持续多久?循环的终点是什么


您还需要重新考虑如何使用
n

计算字符。在这种情况下,请查找单词分隔符。在您的情况下,它是“空格”。此外,计算点之前的最后一个单词,因为它后面没有“空格”

编写主循环的一种方法是:

var
  LastPos, I: Integer;
  Tmp, UserString: String;
begin
  LastPos := 1;
  Tmp := '';
  for I := 1 to Length(UserString) do
  begin
    if (UserString[I] = ' ') or (I = Length(UserString)) then
    begin
      if (I - LastPos >= 3) then Tmp := Tmp + Copy(UserString, LastPos, I - LastPos + 1);
        LastPos := I + 1;
    end;
  end;
  UserString: = Tmp; 
end;

在这种情况下,请查找单词分隔符。在您的情况下,它是“空格”。此外,计算点之前的最后一个单词,因为它后面没有“空格”

编写主循环的一种方法是:

var
  LastPos, I: Integer;
  Tmp, UserString: String;
begin
  LastPos := 1;
  Tmp := '';
  for I := 1 to Length(UserString) do
  begin
    if (UserString[I] = ' ') or (I = Length(UserString)) then
    begin
      if (I - LastPos >= 3) then Tmp := Tmp + Copy(UserString, LastPos, I - LastPos + 1);
        LastPos := I + 1;
    end;
  end;
  UserString: = Tmp; 
end;

再次感谢大家指出了正确的方向。我终于想出了我最初想要的解决方案,因此程序实际上删除了短单词(少于3个符号)。下面是我得到的:

VAR
UserString: string; //должна быть строка на 40 символов и точку в конце
i, n: byte;

BEGIN
Writeln('Enter the string:');
Readln(UserString);

i:=0;
n:=1;    

repeat       //MAIN LOOP:

  inc(i);
  if (UserString[i] = ' ') or (UserString[i] = '.') then

     begin
        if (i-n<3)then
        begin
        delete(UserString, n, i-n+1);
        i:=n-1;
        end;
        n:=i+1
     end

until (UserString[i] = '.') or (i>length(UserString));

Writeln('Result String: ', UserString);
END.
VAR
UserString:string;//
i、 n:字节;
开始
Writeln('输入字符串:');
Readln(用户字符串);
i:=0;
n:=1;
重复//主循环:
公司(一);
如果是(UserString[i]=''或(UserString[i]='.'),则
开始
if(i-nlength(UserString));
Writeln('Result String:',UserString);
终止

欢迎任何建议!还有一个关于让程序在控制台模式下重复的开放性问题。标签是最好的方法吗(请参阅问题部分的第一个代码)?

再次感谢大家指出了正确的方向。我终于想出了我最初想要的解决方案,因此程序实际上删除了短单词(少于3个符号)。下面是我得到的:

VAR
UserString: string; //должна быть строка на 40 символов и точку в конце
i, n: byte;

BEGIN
Writeln('Enter the string:');
Readln(UserString);

i:=0;
n:=1;    

repeat       //MAIN LOOP:

  inc(i);
  if (UserString[i] = ' ') or (UserString[i] = '.') then

     begin
        if (i-n<3)then
        begin
        delete(UserString, n, i-n+1);
        i:=n-1;
        end;
        n:=i+1
     end

until (UserString[i] = '.') or (i>length(UserString));

Writeln('Result String: ', UserString);
END.
VAR
UserString:string;//
i、 n:字节;
开始
Writeln('输入字符串:');
Readln(用户字符串);
i:=0;
n:=1;
重复//主循环:
公司(一);
如果是(UserString[i]=''或(UserString[i]='.'),则
开始
if(i-nlength(UserString));
Writeln('Result String:',UserString);
终止
欢迎任何建议!还有一个关于在控制台模式下重复程序的开放性问题。标签是最好的方法吗(请参阅问题部分的第一个代码)?

另一种方法:

uses classes;

var v : TStringlist;
    i : integer;
begin
 v :=TStringlist.create;
 v.strictdelimiter:=true;
 v.delimiter:=' ';
 v.delimitedtext:='This is a simple string a man types';
 for i:=v.count-1 downto 0 do
    if length(v[i])<3 then
       v.delete(i);
 writeln(v.delimitedtext);
 v.free;
end.
使用类;
var v:TStringlist;
i:整数;
开始
v:=TStringlist.create;
v、 strictdelimiter:=true;
v、 分隔符:='';
v、 delimitedtext:=“这是一个男人键入的简单字符串”;
对于i:=v.count-1到0 do
如果长度(v[i])采用不同的方法:

uses classes;

var v : TStringlist;
    i : integer;
begin
 v :=TStringlist.create;
 v.strictdelimiter:=true;
 v.delimiter:=' ';
 v.delimitedtext:='This is a simple string a man types';
 for i:=v.count-1 downto 0 do
    if length(v[i])<3 then
       v.delete(i);
 writeln(v.delimitedtext);
 v.free;
end.
使用类;
var v:TStringlist;
i:整数;
开始
v:=TStringlist.create;
v、 strictdelimiter:=true;
v、 分隔符:='';
v、 delimitedtext:=“这是一个男人键入的简单字符串”;
对于i:=v.count-1到0 do

如果长度(v[i]),可能只有我一个人,但你问的不太清楚。你能发布一些示例输入和预期输出,以及你得到的错误吗?当然。所以我们需要一个用户的字符串作为输入,如下所示:“这是一个男人键入的简单字符串。”在这个字符串中,程序应该删除每个短于3个符号的单词。在我们的字符串中,这些是:“is,a,a”。因此输出应该是“this simple string man types”。
while(UserString[i]“”)do inc(n);
是一个无止境的循环。[i]因此,“永不改变”是毫无意义的,
!是的,就在几个小时前。它很有效,非常感谢,@Nasreddi