使用Pchar类型的问题.

spoky 2003-03-23 09:01:11
使用Pchar类型的问题:
pchar类型变量之间怎么赋值阿?
也即是说使用了strpos(str1,str2)函数之后,会返回一个pchar指针。Returns a pointer to the first occurrence of STR2 in STR1.
然后我想要从返回的这个指针的位置开始再向后面搜索同样的str2。那么我应该怎么做阿?

...全文
56 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
spoky 2003-03-23
  • 打赏
  • 举报
回复
感激到痛哭流涕阿
期限就要到了,终于找到了方向。
sysu的例子让我知道了应该怎么使用pchar。
其他的函数也可以开始进行编写了。
sysu 2003-03-23
  • 打赏
  • 举报
回复
procedure TForm1.FormCreate(Sender: TObject);
var
str1,str2,str3,str4,str:pchar;
i, n: Integer;
begin
str2:= 'www.csdn.com';
str1:= '.';

i := 0;
n := 2; // 查找第n个
str4 := str2;
str3 := StrPos(str2, str1);
str := nil;
while str3 <> nil do begin
Inc(i);
if i = n then begin
str := AllocMem(Integer(str3)-Integer(str4)+1);
StrLCopy(str, str4, Integer(str3)-Integer(str4));
Break;
end;
Inc(str3);
str4 := str3;
str3 := StrPos(str3, str1);
end;
if str = nil then begin
str := AllocMem(StrLen(str4)+1);
StrCopy(str, str4);
end;
ShowMessage(str);
FreeMem(str);
end;
okook 2003-03-23
  • 打赏
  • 举报
回复
一个不成文的原则是:内存在哪里申请,在哪里释放.看看win32 api 的设计就知道了.如果返回pchar的话,除非是你自己模块内部的函数,不给别人调用的,否则使用你这个函数的人很难明白该什么时候去释放这块内存.

不过参数形式可以是:
procedure(const buff :PChar,const bufflen:Word)
多加一个bufflen参数,供函数内部做验证用.
spoky 2003-03-23
  • 打赏
  • 举报
回复
谢谢sysu,
那么该如何取得用'.'分割开的第N个字符串呢?
返回结果也是pchar类型时的情况。

我的想法是当知道了第N-1个'.'的位置,然后又知道了第N个点的位置,
那么就可以截取中间的字符串出来拉。但是具体应该怎么写法呢。

如果是在delphi环境中就很简单了,但是在可以被其他程序共享的DLL中
我确实是被指针搞到昏掉了。刚学delphi,就碰上这种任务,惨呐!!!
LLeezhiling 2003-03-23
  • 打赏
  • 举报
回复
好像错误在??处
while str3 <> nil do begin
ShowMessage(str3);
Inc(str3);
str3 := StrPos(str3, str2);??
end;
你试一试在Inc(str3)之后,看一看str3的值,即str3^是什么?
呵呵,知道错误了吧。
sysu 2003-03-23
  • 打赏
  • 举报
回复
StrPos的参数顺序颠倒了,后面的参数才是要搜索的字符串,StrPos(str2, str1)
procedure TForm1.FormCreate(Sender: TObject);
var
str1,str2,str3:pchar;
begin
str2:= 'www.csdn.com'; // 直接指向字符串,不要用pchar(...)
str1:= '.';

str3 := StrPos(str2, str1);
while str3 <> nil do begin
ShowMessage(str3);
Inc(str3);
str3 := StrPos(str3, str1);
end;
spoky 2003-03-23
  • 打赏
  • 举报
回复
我刚才测试了一下,可是怎么样得到的都是为空指针阿?
而且还说是"非法存取"。
procedure TForm1.FormCreate(Sender: TObject);
var
str1,str2,str3:pchar;
begin
str2:= pchar('www.csdn.com');
str1:= pchar('.');

str3 := StrPos(str1, str2);
while str3 <> nil do begin
ShowMessage(str3);
Inc(str3);
str3 := StrPos(str3, str2);
end;

Linux2001 2003-03-23
  • 打赏
  • 举报
回复
死树,我觉得你的速度简直令人叹为观止
sysu 2003-03-23
  • 打赏
  • 举报
回复
不用初始化,你可以把str3看成指向str1内容的指针,向后移动搜索。
spoky 2003-03-23
  • 打赏
  • 举报
回复
那么str3是否需要进行初始化。例如getmem()?

gemem()函数是不是这样写的:getmem(str2,sizeof(str1))?
sysu 2003-03-23
  • 打赏
  • 举报
回复
循环:
str3 := StrPos(str1, str2);
while str3 <> nil do begin
ShowMessage(str3);
Inc(str3);
str3 := StrPos(str3, str2);
end;
sysu 2003-03-23
  • 打赏
  • 举报
回复
str3 := StrPos(str1, str2);
Inc(str3); // +1
str3 := StrPos(str3, str2); // 再向后搜索

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧