2016-06-27 1 views
1

독일어 사이트 delphi-treff에서 delphi를 배우고 있습니다.임의의 문자열 생성시 프로그램 고정

그들은 임의의 문자열을 생성하는 기능을 제공합니다.

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; 

당신이 여기에서 볼 수

https://www.delphi-treff.de/tipps-tricks/object-pascal/strings/zufallstring-generieren/ : 그들은 단지 0-1을 넣어

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

, A-Z와 문자로 A-Z.

그러나이 기능으로 인해 프로그램이 다운 된 것 같습니다.

그래서 변경 : until length (result) = strlength;

to : length (result)> = strlength;

실제로 실제로는> strlength입니다.

누군가가 왜 더 큰지 설명 할 수 있습니까?

한 번에 한 문자 씩 추가하기 때문에 크기가 커야합니까?

+0

'결과'는 루프 전에 초기화되지 않으므로 길이가 오버플로됩니다. 'Randomize'는 프로그램 시작시 한 번만 초기화되어야합니다. –

+0

@LURD 그래서 결과는 strlength보다 긴 임의의 값으로 초기화되므로 기준을 결코 충족시키지 못합니까? – 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

결과가 * 결코 * 초기화되지 않지만 비어있을 필요는 없습니다. –