从字符串中读取整数

时间:2020-09-05 21:32:14

标签: algorithm input pascal

我正在学习算法,并且正在尝试创建一种提取数字的算法,让我们从字符串中说出[1..100]中的n。希望我能得到一个更简单的算法。

我尝试了以下方法:

procedure ReadQuery(var t : tab); // t is an array of Integer.
var 
    x,v,e : Integer;
    inputs : String;
begin
    //readln(inputs);
    inputs:='1  2 3';
    j:= 1;
    // make sure that there is one space between two integers
    repeat
        x:= pos('  ', inputs); // position of the space
        delete(inputs, x, 1)
    until (x = 0);
    x:= pos(' ', inputs); // position of the space
    while x <> 0 do
    begin  
        x:= pos(' ', inputs); //(1) '1_2_3' (2) '2_3'
        val(copy(inputs, 1, x-1), v, e); // v = value | e = error pos
        t[j]:=v;    
        delete(inputs, 1, x); //(1) '2_3' (2) '3'
        j:=j+1; //(1) j = 2 (2) j = 3
        //writeln(v);   
    end;
    //j:=j+1; // <--- The mistake were simply here.
    val(inputs, v, e);
    t[j]:=v;
    //writeln(v);   
end;

我得到这个结果(已解决):

1
2
0
3

预期:

1
2
3

PS:我不是很先进,所以请原谅我。 感谢所有尝试分享知识的人。

1 个答案:

答案 0 :(得分:2)

您的代码效率很低,并且通常不适用于包含数字的字符串。

一种标准且高效的方法如下:

type
  TIntArr = array of Integer;

function GetNumbers(const S: string): TIntArr;

const
  AllocStep = 1024;
  Digits = ['0'..'9'];

var
  i: Integer;
  InNumber: Boolean;
  NumStartPos: Integer;
  NumCount: Integer;

  procedure Add(Value: Integer);
  begin
    if NumCount = Length(Result) then
      SetLength(Result, Length(Result) + AllocStep);
    Result[NumCount] := Value;
    Inc(NumCount);
  end;

begin

  InNumber := False;
  NumCount := 0;
  for i := 1 to S.Length do
    if not InNumber then
    begin
      if S[i] in Digits then
      begin
        NumStartPos := i;
        InNumber := True;
      end;
    end
    else
    begin
      if not (S[i] in Digits) then
      begin
        Add(StrToInt(Copy(S, NumStartPos, i - NumStartPos)));
        InNumber := False;
      end;
    end;

  if InNumber then
    Add(StrToInt(Copy(S, NumStartPos)));

  SetLength(Result, NumCount);

end;

此代码是故意以某种老式的Pascal方式编写的。如果您使用的是Delphi的现代版本,则不会这样写。 (相反,您可以使用TList<Integer>并进行其他一些调整。)

尝试以下输入:

521 cats, 432 dogs, and 1487 rabbits
1 2 3 4 5000 star 6000
alpha1beta2gamma3delta
a1024b2048cdef32
a1b2c3
32h50s
5020
   012       123!    
horses
(empty string)

确保您完全了解算法!逐行在纸上运行几次。