急急:怎样实现PChar类型和string类型之间的转换???(只有这么一点家底了)o~o(85分)

  • 主题发起人 主题发起人 gamblegod
  • 开始时间 开始时间
Long string to PChar conversions are not automatic. Some of the differences between strings and
PChars can make conversions problematic:

Long strings are reference-counted, while PChars are not.
Assigning to a string copies the data, while a PChar is a pointer to memory.
Long strings are null-terminated and also contain the length of the string, while PChars are simply null-terminated.

Situations in which these differences can cause subtle errors are discussed in this section.
 
可以使用PCHAR(S)将STRING类型的S转换为PCHAR!
 
var
a:Pchar;
b:string;
begin
b:='gamblegod';
a:=PChar(b);
b:=a;
end;
 
留点分好不好呀,~!
 
是这样的,由于string类型是动态分配内存,而很多API函数需要传递pChar类型
的参数,而这类pChar类型的参数不能用强制转换pChar(@string_var[1]),如:
x:string;
......
gethostname(pChar(@string[1]),50);
.......
就上面的例子而言,其实可以用字符数组解决的,但是我想用string类型,不知
该怎么办?另外,如果存放相同的内容,字节数组和字符数组有什么区别?


 
x:PChar;

GetMem(x, 50);
try
GetHostName(x, 50);
...
finally
FreeMem(x);
end;
 
x:string;
......
SetLength(x, 50);
gethostname(pChar(@x[1]),50)
// 或者GetHostName(PChar(x), 50);
.......
 
很多场合string可以直接用.
对于string=>pchar 用pchar(str)
对于pchar=>string 用strpas(pstr)
 
x[1]应该是一个CHAR型,而不是一个STRING型的吧,pchar()里能放一个CHAR型的吗?
不行吧
 
三、字符串string 字符数组与指向字
  符串的指针pchar的区别与联系
  这3者的基本概念相同,但有一些非常细微的差别,在编程时稍不注意就会出错,需高度重视。
  1、使用指向字符串的指针,如果不是以0结尾,运行时就会出现错误。为了避免这种错误,需要在字符串结尾人工加入0 即char(0),或用strpcopy函数在字符串结尾自动加0。
  例1: 指向字符串的指针,如果不是以0结尾,运行时会出现错误:
  {s[0]=3 s[1]='n' s[2]='e' s[3]='w'}
  var
  s:string;
p:pchar;
  begin
  s:='new'

  label1.caption:=s
{new}
 label2.caption:=intTostr(integer(s[0]));{3是字符串的长度}
  p:=@s[1];{不是以0结尾,莫用pchar型指针}
   label3.caption:=strpas(p)
{运行时出现错误}
  end;

  例2:在字符串结尾人工加入0即char(0),可使用指向字符串的指针。
  {s[0]=4 s[1]='n' s[2]='e' s[3]='w' s[4]=0;}
  {p-->'new'}
  var
s:string

p:pchar;
  begin
  p:=@s[1];
  s:='new'+char(0)
{以0结尾,可用pchar型指针}
  label1.caption:=strpas(p)
{new}
  label2.caption:=s
{new}
   label3.caption:=intTostr(integer(s[0]))
{4是字符串长度}
  end;

  例3: 用strpcopy函数赋值会在字符串s结尾自动加0。
  {s[0]=4 s[1]='n' s[2]='e' s[3]='w' s[4]=0;}
  {p-->'new'}
  var
s:string

p:pchar;
  begin
  p:=@s[1];
 strpcopy(p,'new');{strpcopy函数在字符串结尾自动加0}
  label1.caption:=strpas(p);{new}
   label2.caption:=s;{new}
  label3.caption:=intTostr(integer(s[0]));{4}
  end;

  2、下标为0的字符串标识符存放的是字符串长度,字符型数组基本相当于字符串,但不能存放字符串长度。字符串可以用s:='a string'的形式赋值,但是字符型数组a[ ]不可直接用a:='array'的形式赋值,用此种形式会出现类型不匹配错误,可选用strpcopy函数赋值。

  例4: 字符型数组s[ ]相当于字符串,但没有存放字符串长度的位置。
  {s[1]='n' s[2]='e' s[3]='w' s[4]=0;}
  {p-->'new'}
  var
s:array[1..10] of char

p:pchar;
  begin
  {s:='new'+char(0)
error}{错误}
  p:=@s[1];
  {p:=@s
is not correct}
  strpcopy(p,'new');
  label1.caption:=strpas(p);{new}
  label2.caption:=s;{new}
   {label3.caption:=intTostr(integer(s[0]));}{不会出现4, 下标超出错误}
  end;

  例5:下标从0开始的字符数组s,s相当于@s[0]。
  { s[0]='n' s[1]='e' s[2]='w' s[3]=0;}{p-->'new'}
  var
s:array[1..10] of char

p:pchar;
  begin
  {s:='new'+char(0)
error}{错误}
  p:=s;
  {p:=@s[0] is also correct}
  strpcopy(p,'new');
  label1.caption:=strpas(p);{new}
  label2.caption:=s;{new}
  label3.caption:=s[0];{n}
end;

  3、下标从0开始和从1开始的字符数组地址的表示方法也有细微不同:

  例6:下标从1开始的数组a 与下标从0开始的数组b 的比较。
  var
a:array[1..10]of char

b:array[0..10]of char;
  {a:='1..10';}{type mismatch}
  {b:='0..10';}{type mismatch}
begin
  strpcopy( b, 'from 0 to 10')
{正确 因为b即是@b[0] }
  strpcopy(@b[0], 'from 0 to 10')
{正确 与上个表达式结果相同}
  strpcopy(@a[1], 'from 1 to 10')
{正确 }
  strpcopy( a, 'from 1 to 10')
{类型匹配错误 因为a即是@a[0]}
end;
我也是刚好在一个网页上看到的!!
 
谢谢各位的关心,每人分着用!
 
后退
顶部