delphi char數組、string和Pchar的相互轉換

來源:互聯網
上載者:User

標籤:亂碼   poi   代碼   pch   phi   vc++   速度   any   轉換   

因為要調用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
   使用StrPas函數擷取數組的首地址

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:[email protected][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來決定字串的結尾的。
因為PChar是指標,所以它能指向任何地方(也就是說它不一定非要指向字串不可).把一個String賦值給PChar只是將String中儲存具體字串的記憶體的地址給PChar變數. 當然也可以把Char數組第一個元素的地址給PChar.


至於 哪個佔用記憶體小, Char數組<PChar(指分配過字串的)<string(除了具體字串外還包含字串長度)
如果Null 字元串那麼PChar<String<array [0..n] of Char
從速度來說毫無疑問string最慢, 例如:
作為參數傳遞(非var調用時)給過程時string將整個字串的副本傳遞過去, PChar將指標本身的副本傳遞過去(32位), Char數組和PChar一樣, 傳遞的是第一個元素的地址副本.不過就靈活性來說string最高, 而且Delphi支援的函數最多. 另外可以將String作為Buffer使用(因為它當中可以包含字元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.
StrPCopy does not perform any length checking. 
The destination buffer must have room for at least Length(Source)+1 characters

正確代碼如下:

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

delphi char數組、string和Pchar的相互轉換

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.