从字符串中读取整数

Read integers from a string

我正在学习算法,我正在尝试制作一种算法来从字符串中提取数字 n in [1..100]。希望我能得到一个更简单的算法。

我尝试了以下方法:

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 : 我不是很高级,所以请原谅我把你降低到基础。 感谢所有试图分享知识的人。

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

标准和高效的方法是这样的:

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;

此代码是有意以某种 old-fashioned 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)

确保你完全理解算法! 运行它在纸上写了几次,一行一行。