在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
因为要调用windows的api或者给vc++写接口,很多地方都要用到pchar,现在将char数组、string和pchar之间的相互转换都列出来,都是网上找的资料,我总结一下,先直接上代码,再讲原理。 1.string转换成pchar 可以使用pchar进行强制类型转换,也可以使用StrPCopy函数 var s:string; p,p1:PChar; begin s:='Hello Delphi'; p:=PChar(s); ShowMessage(p); p1:=StrAlloc(Length(s)+1); StrPCopy(p1,s); ShowMessage(p1); StrDispose(p1); end;
2.pchar转换成string pchar可以直接当string用,也可以用strpas函数转换一下 var s,s1,s2:string; p:PChar; begin s:='Hello Delphi'; p:=PChar(s); ShowMessage(p); s1:=p; ShowMessage(s1); s2:=StrPas(p); ShowMessage(s2); end;
3.char数组转换成string var c:array [0..11] of Char; s:string; begin c[0]:='H'; c[1]:='e'; c[2]:='l'; c[3]:='l'; c[4]:='o'; c[5]:=' '; c[6]:='D'; c[7]:='e'; c[8]:='l'; c[9]:='p'; c[10]:='h'; c[11]:='i'; s:=StrPas(@c[0]); ShowMessage(s); end;
4.string转char数组 使用move或者copymemory函数 var s:string; c:array of Char; i:Integer; begin s:='Hello Delphi'; SetLength(c,Length(s)); //Move(s[1],c[0],Length(s));//move和CopyMemory都行 CopyMemory(@c[0],PChar(s),Length(s)); for i:=Low(c) to High(c) do begin ShowMessage(string(c[i])) end; end;
5.char数组转pchar var c:array [0..11] of Char; p:PChar; begin c:='Hello Delphi'; //p:=@c[0]; p:=PChar(@c[0]); ShowMessage(StrPas(p)); end;
6.pchar转char数组 使用move或者CopyMemory函数 var s:string; p:PChar; c:array of Char; i:Integer; begin s:='Hello Delphi'; p:=PChar(s); SetLength(c,Length(s)); //Move(p^,c[0],Length(s));//move和CopyMemory都行 CopyMemory(@c[0],p,Length(s));; for i:=Low(c) to High(c) do begin ShowMessage(string(c[i])) end; end;
现在讲讲char数组、pchar和string string和Char数组都是一块内存,其中存放连续的字符. string保存具体字符的内存对用户是透明的, 由Delphi管理它的分配, 复制和释放, 用户不能干预(其实也可以, 不过是通过非法途径). Char数组就不必说了吧?PChar是一个指针, 它的大小只有32位. 定义时由Delphi自动填0. 要将PChar作为字符串使用的话必须自己分配内存用完必须自己释放. PChar型字符串由#0表示字符串结尾Delphi所提供的相关PChar字符串的操作都是判断#0来决定字符串的结尾的。
注:因为string和char数组都是连续的,所以指向string的首地址的指针为@s[1],指向char数组的首地址的指针为@c[0]。pchar是以#0结尾的,所以很多关于pchar 的函数的使用的时候要注意,如使用StrAlloc函数给pchar分配内存的时候和使用StrPCopy函数的时候 7.使用StrAlloc函数将一个string转换给pchar var p:PChar; s:string; begin s:='ABCDEF'; p:=StrAlloc(Length(s)); Move(s[1],p^,Length(s)); ShowMessage(StrPas(p)); StrDispose(p); end;
执行以上代码的时候,字符串后面有乱码,查看delphi帮助里面关于StrAlloc函数
delphi的帮助如下: StrAlloc allocates a buffer for a null-terminated string with a maximum length ofSize - 1 (1 byte must be reserved for the termination character). StrAlloc函数给pchar指向的字符串分配的实力内存为size-1个字节,所以我们要多分配一个字节的内存,用来存pchar的结束标志#0 正确使用如下: var p:PChar; s:string; begin s:='ABCDEF'; p:=StrAlloc(Length(s)+1); Move(s[1],p^,Length(s)+1);//将s的内容按照字节复制到p里面 //Move(s[1],p^,Length(s)); //执行这句会出现乱码 ShowMessage(StrPas(p)); StrDispose(p); end;
8.使用StrPCopy将string转换成char数组 var s:string; c:array of Char; i:Integer; begin s:='Hello Delphi'; SetLength(c,Length(s)); StrPCopy(@c[0],s); for i:=Low(c) to High(c) do begin ShowMessage(string(c[i])) end; end;
以上代码执行的时候会报错,查看delphi帮助才知道,strpcopy函数不做长度检查,需要程序员自己控制。
delphi帮助如下: StrPCopy copies Source into a null-terminated string Dest. It returns a pointer to Dest. 正确代码如下: var s:string; c:array of Char; i:Integer; begin s:='Hello Delphi'; SetLength(c,Length(s)+1); StrPCopy(@c[0],s); for i:=Low(c) to High(c) do begin ShowMessage(string(c[i])) end; end; 使用strpcopy函数的时候一定要保证目的pchar的长度至少是源字符串的长度+1 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论