2016-06-27 29 views
1

我在德国网站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的字符。

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

所以我改变了:直到length(result)= strlength;

to:until length(result)> = strlength;

实际上它有时是> strlength。

有人可以解释为什么它更大吗?

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

+0

Result'在循环之前未被初始化,因此长度溢出。 'Randomize'只能在程序启动时初始化一次。 –

+0

@LURD等结果得到一个随机值的初始化比字符串长,因此永远不会符合标准? – Thomas

+0

请参阅[Delphi中'Result'的默认值是什么?](http://stackoverflow.com/questions/5336863/what-is-the-default-value-of-result-in-delphi)。 –

回答

4

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

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

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

+1

结果*从不*未初始化,但它也不一定是空的。 –