2010-05-28 96 views
2

這是我試圖解決About.com Delphi challenge to un-camel-case a string這段代碼有什麼問題來解開字符串?

unit challenge1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls; 

type 
    check = 65..90; 
    TForm1 = class(TForm) 
    Edit1: TEdit; 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 
    var s1,s2 :string; 
    int : integer; 

implementation 

{$R *.dfm} 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    i: Integer; 
    checks : set of check; 
begin 
    s1 := edit1.Text; 
    for i := 1 to 20 do 
    begin 
    int :=ord(s1[i]) ; 
    if int in checks then 
     insert(' ',s1,i-1); 
    end; 
    showmessage(s1); 
end; 

end. 

check是一組包含大寫字母所以基本上每當一個大寫字母遇到插入功能的遭遇(在s1字符串內)之前添加空間,但我的代碼什麼也不做。 ShowMessage只顯示文本,因爲它是在Edit1中輸入的。我做錯了什麼?

回答

3

你是正確的,check是一組,但是你有沒有分配給它的任何值還,所以它的價值是不確定的。沒有你期望的字符,所以in測試可能總是失敗。 (沒有編譯器警告你,你還沒有分配任何東西check?)

你真的不想把check定義爲子範圍類型。相反,您應該使用內置的TSysCharSet類型替換check,這是一組字符。然後分配check這樣的:

check := ['A'..'Z']; 

此外,而不是intOrd檢查字符串的數值,只需直接使用Char值:if s1[i] in check。您還需要使用Length函數,以便處理整個字符串,而不是假定輸入總是長達20個字符。您還需要將結果存儲到從1995年起s1其他的東西,如Caldon points out,你不希望在同一時間,你仍然從中讀取更多的字符進行修改。

+0

爲什麼是空的? Uwe說沒有定義,這對我更有意義。 – 2010-05-28 21:37:19

2

checks是本地的方法,從不初始化。它可能包含隨機數據,但很可能不包含您期望的數據(也許它是一個空集)。所以IF-條件可能永遠不會成爲現實。

3

,如果你嘗試例如你的程序字符串「MyText」,然後在第一個循環中它正確地認識到「M」是大寫字母,所以它在它之前進入一個空格......所以字符串是「MyText」......現在在下一個循環中,i = 2和S1 [I]又是「M」,所以它才插入一個空間......等等......