如何计算Delphi中每个单词的长度?

时间:2014-10-26 08:24:51

标签: delphi delphi-7

我是一名10年级的IT学生,所以我对Delphi相对较新。我需要制作一个程序,从编辑框接收句子作为输入。单词的数量和每个的长度。我可以在句子中找到第一个空格的位置,但不知道如何找到每个空格。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:4)

这取决于您使用哪个版本的Delphi。以下是两种可能的解决方案:

  1. 所有Delphi版本:
  2. var input : string;
        aword : string;
        r: Integer;
        allowedchars : set of 'A'..'z';
    begin
      allowedchars:=['A'..'z'];
      ListBox1.Clear;
      input:='This is my test sentence. Feel free to count words, or let it count!';
      for r := 1 to Length(input) do begin
        if(input[r] in allowedchars)then begin
          aword:=aword+input[r];
        end else begin
          if(length(aword)>0)then
          ListBox1.Items.Add(Format('%s: %d',[aword,Length(aword)]));
          aword:='';
        end;
      end;
    end;
    
    1. 较新的Delphi版本,来自XE3
    2. var input : string;
          words : TArray<string>;
          aword : string;
      begin
        ListBox1.Clear;
        //1. Use the Split Helper Method, from XE3 and newer Delphis
        input:='This is my test sentence. Feel free to count words, or let it count!';
        words:=input.Split(['.',';',',','!','?',' '],TStringSplitOptions.ExcludeEmpty);
        ListBox1.Items.Add(Format('Words: %d',[Length(words)]));
        for aword in words do begin
          ListBox1.Items.Add(Format('%s: %d',[aword,aword.Length]));
        end;
      end;
      

答案 1 :(得分:2)

您可以使用TStringList类将字符串拆分为具有指定Delimiter属性和DelimitedText方法的子字符串。

program Project1;

{$APPTYPE CONSOLE}

uses
  System.SysUtils,Classes;

procedure CheckString( const someText: String; var wordLength: TArray<Integer>);
var
  aList: TStringList;
  i: Integer;
begin
  aList := TStringList.Create;
  try
    aList.Delimiter := ' ';  // Define the delimiter
    aList.DelimitedText := someText;  // Split the text
    SetLength(wordLength,aList.Count);  // Set the result word count
    for i := 0 to Pred(aList.Count) do
    begin
      wordLength[i] := Length(aList[i]);    // Set the word length
    end;
  finally
    aList.Free;
  end;
end;

var
  s: String;
  counter: TArray<Integer>;
  i: Integer;
begin
  s := 'This is a  test.';
  CheckString(s,counter);
  WriteLn('Found words:',Length(counter));
  for i := 0 to Pred(Length(counter)) do
    WriteLn(counter[i]);
  ReadLn;
end.

如果您使用的是较旧版本的Delphi,请将TArray<Integer>替换为TIntegerDynArray单元中定义的Types。 在旧的Delphi-7中,你必须自己声明:

Type
  TIntegerDynArray = array of Integer;

如果要在拆分前从字符串中排除某些字符,请使用以下函数:

function StripChars(const aSrc, aCharsToStrip: string): string;
var
  i: Integer;
begin
  Result := aSrc;
  for i := 1 to Pred(Length(aCharsToStrip) do
    Result := StringReplace(Result, aCharsToStrip[i], '', 
      [rfReplaceAll, rfIgnoreCase]);
end;

// Example call
myString := StripChars(s,'.,!?;');

答案 2 :(得分:1)

您可能会发现posex功能非常有用......如果它是D7的一部分

否则,请查找delete函数或copy函数。