【问题标题】:Program freezing on generating random string程序冻结生成随机字符串
【发布时间】:2016-06-27 20:18:08
【问题描述】:

我正在德国网站 delphi-treff 上学习 delphi。

他们提供了一个生成随机字符串的函数。

https://www.delphi-treff.de/tipps-tricks/object-pascal/strings/zufallstring-generieren/

function RandomString(strlength: integer): string;
var
  temp : integer;
begin
  randomize;
  repeat
    temp := random(122); //ggf. erhöhen
    if temp in [48..57{0-1}, 65..90{A-Z}, 97..122{a-z}] then
    //Kann um beliebige ASCII-Zeichen erweitert werden,
    //ggf. den Wert in Random hochsetzen
      result := result + Chr(temp);
  until length(result) = strlength;
end;

如您所见:

if temp in [48..57{0-1}, 65..90{A-Z}, 97..122{a-z}] then

他们只将 0-1、A-Z 和 a-z 作为字符。

但是我认为我的程序会因为这个函数而崩溃。

所以我改变了:直到长度(结果)= strlength;

到:直到长度(结果)>= strlength;

确实有时是> strlength。

谁能解释为什么它更大?

它不应该更大,因为它一次只添加 1 个字符?

【问题讨论】:

  • Result 在循环之前未初始化,因此长度溢出。 Randomize 只能在程序启动时初始化一次。
  • @LURD 所以 Result 被初始化为一个比 strlength 长的随机值,因此永远不会满足条件?
  • 感谢@LURD。我想我应该写管理员,因为我花了几个小时试图找出我的程序冻结。再次感谢
  • 请注意序数 48..57 代表 ASCII 字符 '0'..'9',(不是 '0'..'1')并且函数的结果从不包含一个“z”(序数 122),因为 function Random(const ARange: integer): integer 返回一个数字 X,即 0 <= X < ARange

标签: delphi


【解决方案1】:

Result 被视为隐式var 参数,必须在使用前进行初始化。见What is the default value of 'Result' in Delphi?

在这种情况下,未初始化的Result 参数将导致长度溢出。

另一个问题,Randomize 只能在程序启动时调用一次。

【讨论】:

  • 结果从不未初始化,但也不必为空。
猜你喜欢
  • 2015-02-26
  • 2017-08-01
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多