关于pos,length函数和pchar类型的使用问题
在我的一段代码中具体情况如下:
var
receive : pchar;
...
begin
...
receive := somefunction(...);
if pos('error',receive) > 0 then
begin
Result := receive;
exit;
end;
....end;在使用pos函数后我发现pchar变量receive的数据被部分丢弃....在同样的位置我使用length(receive)函数来处理receive的长度可以得到其准确的长度80但是使用length()之后pchar变量出现相同的问题...()
在我的一段代码中具体情况如下:
var
receive : pchar;
...
begin
...
receive := somefunction(...);
if pos('error',receive) > 0 then
begin
Result := receive;
exit;
end;
....end;在使用pos函数后我发现pchar变量receive的数据被部分丢弃....在同样的位置我使用length(receive)函数来处理receive的长度可以得到其准确的长度80但是使用length()之后pchar变量出现相同的问题...()
解决方案 »
- 简单的按钮状态控制
- 在线跪等:如何修改linker设置,才能在非vcl环境下运行
- MIDAS的Sorcket方式,字符串数据右截断错误
- 请有控制其它应用程序经验的人请进?
- ADO和BDE的小问题,十分菜的!!!!!!!!!!!!!!!!
- delphi中如何实现类似于excel中导入文本文件的功能?
- 请教如何获得当前程序的路径
- 怎样在MDI上放置按钮控件?最后40分了...
- 如何实现在ListView中对Items的双击事件?
- 在一个Excel文件中,怎样只写其中的一列,而其他的列不改变。
- 在线求救:Adoconnection连接有密码的数据库的问题
- 执行一个返回 REF CURSOR 参数的 PL/SQL Packages存储过程后,如何在Delphi应用当读取它呢?。
str: string;
begin
str := strpas(receive);这样再操作
'52455354ADBAACAB60F91700F8EBFD7F0000000001010000D8F81700020000000200000000000000'#0
在使用strpas()后
var
receive : pchar;
my_receive : string;
...
begin
...
my_receive := strpas(receive)
...
end;receive 的数据变为:'0000000001010000'#0
myreceive的数据变为:'52455354ADBAACAB60F91700F8EBFD7F0000000001010000'#0#0'F81700020000000200000000000000'?????
PChar是以#0结尾的,如果字符串内容中包含了#0,那么“数据被部分丢弃”就有可能了
建议将内容的长度一并打包处理
receive : pchar;
rec1:string;
...
begin
...
receive := somefunction(...);
rec1:=receive;
if pos('error',rec1) > 0 then
begin
Result := pchar(rec1);
exit;
end;
....end;
在模拟一个错误的环境等下发上来
var
S: pchar;
T: String;
begin
S := '52455354AD'+#0+
'BAACAB60F9
1700F8EBFD
7F0000'+#0+'000
001010000D
8F81700020
0000002000
0000000000
0' + #0;
// T := inttostr(strlen(S));
SetLength(T,83);
Move( S^, PChar(T)^,83);end;
来接受不就行了.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
Tfrm_pchar = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
frm_pchar: Tfrm_pchar;
Function ReadCom:Pchar;implementation{$R *.dfm}procedure Tfrm_pchar.Button1Click(Sender: TObject);
Var
//{$T-}
my_Pchar : Pchar;
//{$T+}
m_data : array[0..3]of char;
str : string;
begin
my_Pchar := ReadCom;
If pos('error',my_Pchar) > 0 then
begin
showmessage(my_Pchar);
end;
showmessage(my_Pchar);end;
Function ReadCom:Pchar;
Var
str,str_tmp : string;
I : Integer;
Begin
str := '52455354ADBAACAB60F91700F8EBFD7F0000000001010000D8F81700020000000200000000000000';
For I := 1 to length(str) do
str_tmp := str_tmp + str[I];
Result := pchar(str_tmp);
end;end.
你将pchar转换为string后再pos
procedure Tfrm_pchar.Button1Click(Sender: TObject);
Var
//{$T-}
my_Pchar : Pchar;
//{$T+}
m_data : array[0..3]of char;
str : string;
begin
my_Pchar := ReadCom; //这里得到的指针指向的数据已经释放了,但由于这块数据并没有被清空或者覆盖,运气好的话还是可以访问到刚才写入的数据,呵呵。 If pos('error',my_Pchar) > 0 then
begin
showmessage(my_Pchar);
end;//执行了部分代码后,这块自由内存可能发生了变化,再拿着指针去访问,数据自然也就不对了
showmessage(my_Pchar);end;
Function ReadCom:Pchar;
Var
str,str_tmp : string;
I : Integer;
Begin
str := '52455354ADBAACAB60F91700F8EBFD7F0000000001010000D8F81700020000000200000000000000';
For I := 1 to length(str) do
str_tmp := str_tmp + str[I]; Result := pchar(str_tmp); //实际返回的就是str_tmp的指针,str_tmp是个临时变量,函数结束后随之释放了。
end;end.
interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
Tfrm_pchar = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
frm_pchar: Tfrm_pchar;
implementation{$R *.dfm}
Procedure ReadCom(Var aPChar: PChar);
Var
Str, Str_tmp: string;
I : Integer;
Begin
Str := '52455354ADBAACAB60F91700F8EBFD7F0000000001010000D8F81700020000000200000000000000';
// SetLength(Str_tmp, Length(Str));
For I := 1 to Length(Str) do
Str_tmp := Str_tmp + Str[I];
CopyMemory(aPChar, Pointer(Str_Tmp), Length(Str_Tmp));
end;
procedure Tfrm_pchar.Button1Click(Sender: TObject);
Var
my_Pchar: Pchar;
m_data: array[0..3]of char;
begin
my_PChar:= AllocMem(255); ReadCom(my_Pchar); If Pos('error', my_Pchar) > 0 then
begin
showmessage(my_Pchar);
end; ShowMessage(my_Pchar); FreeMem(my_PChar);
end;end.
var
str, str_tmp: string;
I : Integer;
Begin
str := '52455354ADBAACAB60F91700F8EBFD7F0000000001010000D8F81700020000000200000000000000';
str_tmp := ''; //初始化
for I := 1 to Length(str) do
str_tmp := str_tmp + str[I];
GetMem(Result, Length(str_tmp) + 1); //分配空间
StrPCopy(Result, str_tmp);
Result[Length(str_tmp)] := #0;
end;procedure TForm1.Button1Click(Sender: TObject);
var
my_Pchar : Pchar;
m_data : array[0..3]of char;
str: string;
begin
my_Pchar := ReadCom;
If pos('error',my_Pchar) > 0 then
begin
showmessage(my_Pchar);
end;
ShowMessage(my_Pchar);
FreeMem(my_Pchar, StrLen(my_Pchar) + 1); //释放空间
end;