2010-05-28 63 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”,所以它才插入一个空间......等等......