送分题,关于字符串的操作!!(50分)

Z

zx

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个程序,关于在文本中检索字符串,能帮我查错吗?
分不多了!帮帮忙!!
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
procedure cutstring(position:integer
cutstring:string);
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
tempfile:textfile;



implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
assignfile(tempfile,'d:/1/default.htm');
reset(tempfile);

end;

procedure TForm1.Button1Click(Sender: TObject);
var
tempstring1,tempstring2:string;
imgstring,hrefstring:string;

begin
tempstring1:='';tempstring2:='';
imgstring:='img src=';
hrefstring:='a href'
while not eof(tempfile) do begin
readln(tempfile,tempstring1);
tempstring1:=lowercase(tempstring1);
if ansipos(imgstring,tempstring1)<>0 then
cutstring(ansipos(imgstring,tempstring1),tempstring2);
Memo1.Lines.Add(tempstring2);
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
closefile(tempfile);

end;

procedure TForm1.cutstring(Position:integer
cutString:string);
var
endstring:string;
i,j:integer;
begin
j:=0;i:=position;endstring:='';setlength(endstring,256);
repeat
endstring[j]:=cutstring;
i:=i+1;j:=j+1;
until (cutstring='>')and(cutstring[i+1]=' ')
cutstring:=endstring;


end;

end.
 
sorry button1click 中少了一个begin ..end
不算!
 
1.第一个毛病,请不要在cutstring函数中使用名为cutstring的参数,
很容易搞乱.

2. 没有看到对tempstring2的赋值,但在cutstring函数中却使用了cutstring
(传过来的是tempstring2)

3.如果想用函数返回值,应该用result:=....,如果想用参数返回值,应该用

function aaaaa(Position:integer
var cutString:string)
^^^
 
cutstring()里对j初始化时,应为1而不是0。
 
谢谢dwwang大哥!!错我都改了!可是还有问题!!
我可真笨!
还是说说程序吧!
我要写的程序是扫描服务器端的html文件,并显示出他的每一个
src img=...... 和 a href=......
大虾您说我这样读文件行不行,好不好??
改过的如下:
implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
assignfile(tempfile,'d:/1/default.htm');
reset(tempfile);

end;

procedure TForm1.Button1Click(Sender: TObject);
var
tempstring1,tempstring2:string;
imgstring,hrefstring:string;

begin
tempstring1:='';
imgstring:='img src=';
hrefstring:='a href'
while not eof(tempfile) do begin
readln(tempfile,tempstring1);
tempstring1:=lowercase(tempstring1);
tempstring2:=tempstring1;
if ansipos(imgstring,tempstring1)<>0 then begin
cutstring(ansipos(imgstring,tempstring1),tempstring2);
Memo1.Lines.Add(tempstring2);
end;
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
closefile(tempfile);

end;

procedure TForm1.cutstring(Position:integer;var cutStr:string);
var
endstring:string;
i,j:integer;
begin
j:=0;i:=position;endstring:=' ';setlength(endstring,256);
repeat
endstring[j]:=cutstr
####
i:=i+1;j:=j+1;
until ((cutstr='>')and(cutstr[i+1]=' '));//or(j>256)
cutstr:=endstring;


end;

看见最后一排有//or(j>256);如果不写这一句,在###句处会出错,
因为endstring长度不够。去掉注释,又报错out of memory!!!
怎么搞的?
还有什么好方法吗??
 
太好了!没有out of memory了!!!!!!!
我又把j初始化为1!!
看我多粗心!!!
不过你们有更好的方法吗??
 
你的程序怎样做我没什么想法,但houyg给你提示的
j应该初始化为1而不是0,你改了吗?
setlength又是干什么呢?难道是为了使编译时不出错?
如果是这样,应该去掉,并且j>256也就不用加了吧。
 
我同意dwwang大虾的观点,但是去掉setlength和j>256后就出错!
 
果然是送分的题

我来回答。其实你的关键错误在于没有彻底的
搞懂null结尾字符串和pascal形式字符串的区别。

1:首先string型的字符串结尾是没有''的。
2:delphi对你那个xxx没有进行越界检查。

所以我劝你还是改用pchar型的吧!就不写程序了
。嘻嘻。
 
您把原始的字符串都小写化了, 可能会出问题, 比如UNIX下文件
名是大小写敏感的. 所以建议您还要改进ansipos, 使之能够做大
小写无关的查找
 
谢谢大家!!!!!
 
接受答案了.
 
没想到送分题竟然送给了我(虚伪地...).
 

Similar threads

I
回复
0
查看
603
import
I
I
回复
0
查看
694
import
I
I
回复
0
查看
504
import
I
I
回复
0
查看
466
import
I
顶部