[ヌルで終わる文字列を操作する]

ヌル文字で終わる文字列を操作する例として下記の7つ方法を記載します

Pcharとstring変数での操作の違いがわかるように、string型の例も同時に記載しています。
但し、最後の大文字・小文字変換は私の環境だと正しく動作しないため、string用の関数を使用しています。

・ヌルで終わる文字列に代入する
・ヌルで終わる文字列の長さを知る
・ヌルで終わる文字列を結合する
・ヌルで終わる文字列の一部を抽出する
・ヌルで終わる文字列を検索する
・ヌルで終わる文字列を比較する
・ヌルで終わる文字列の大文字・小文字変換を行う

◆ヌルで終わる文字列とは

ヌルで終わる文字列とは、末尾にヌル文字(ASCIIコードの00)を付加した文字列のことです。

アセンブリ言語やC言語で文字列を扱う際に用いられててきた形式で、文字列の末尾はヌル文字で自動的に判別できるので、
文字列の先頭アドレスだけを受け渡すだけでよいため、これらの言語で標準的に使われてきました。

ヌルで終わる文字列を扱う際は、先頭のアドレスを受け渡すことになり、ポインタ変数を使用します。
DelphiではPChar変数を使用します。


◆ヌルで終わる文字列に代入する (StrCopy関数を使用します)

【ソースコード】 [tips0029_11.pas]
program tips0029_11;
{$APPTYPE CONSOLE}
uses SysUtils;
var s1,s2:PChar;
begin
 s1:='ABCD';
 GetMem(s2,6);
 try
   StrCopy(s2,s1);
   WriteLn(string(s2));
 finally
   FreeMem(s2);
 end;
end.
【コンパイル&実行】 [tips0029_11.bat]
dcc32 tips0029_11.pas 
tips0029_11.exe  > tips0029_11.txt
pause
【実行結果】 [tips0029_11.txt]
ABCD
<参考:string型の場合> 【ソースコード】 [tips0029_12.pas]
program tips0029_12;
{$APPTYPE CONSOLE}
uses SysUtils;
var s1,s2:string;
begin
 s1:='ABCD';
 s2:=s1;
 WriteLn(s2);
end.
【コンパイル&実行】 [tips0029_12.bat]
dcc32 tips0029_12.pas 
tips0029_12.exe  > tips0029_12.txt
pause
【実行結果】 [tips0029_12.txt]
ABCD
◆ヌルで終わる文字列の長さを知る (StrLen関数を使用します) 【ソースコード】 [tips0029_21.pas]
program tips0029_21;
{$APPTYPE CONSOLE}
uses SysUtils;
var s:PChar;
begin
 s:='ABCD';
 WriteLn(s,'の長さは',IntToStr(StrLen(s)),'バイトです');
end.
【コンパイル&実行】 [tips0029_21.bat]
dcc32 tips0029_21.pas 
tips0029_21.exe  > tips0029_21.txt
pause
【実行結果】 [tips0029_21.txt]
ABCDの長さは4バイトです
<参考:string型の場合> 【ソースコード】 [tips0029_22.pas]
program tips0029_22;
{$APPTYPE CONSOLE}
uses SysUtils;
var s:string;
begin
 s:='ABCD';
 WriteLn(s,'の長さは',IntToStr(Length(s)),'バイトです');
end.
【コンパイル&実行】 [tips0029_22.bat]
dcc32 tips0029_22.pas 
tips0029_22.exe  > tips0029_22.txt
pause
【実行結果】 [tips0029_22.txt]
ABCDの長さは4バイトです
◆ヌルで終わる文字列を結合する (StrCat関数を使用します) 【ソースコード】 [tips0029_31.pas]
program tips0029_31;
{$APPTYPE CONSOLE}
uses SysUtils;
var s1,s2,s:PChar;
begin
 s1:='ABC';
 s2:='DEF';
 GetMem(s,StrLen(s1)+StrLen(s2)+1);
 try
   StrCopy(s,s1);
   StrCat(s,s2);
   WriteLn(string(s));
 finally
   FreeMem(s);
 end;
end.
【コンパイル&実行】 [tips0029_31.bat]
dcc32 tips0029_31.pas 
tips0029_31.exe  > tips0029_31.txt
pause
【実行結果】 [tips0029_31.txt]
ABCDEF
<参考:string型の場合> 【ソースコード】 [tips0029_32.pas]
program tips0029_32;
{$APPTYPE CONSOLE}
uses SysUtils;
var s1,s2:string;
begin
 s1:='ABC';
 s2:='DEF';
 WriteLn(s1+s2);
end.
【コンパイル&実行】 [tips0029_32.bat]
dcc32 tips0029_32.pas 
tips0029_32.exe  > tips0029_32.txt
pause
【実行結果】 [tips0029_32.txt]
ABCDEF
◆ヌルで終わる文字列の一部を抽出する (StrMove関数を使用します) 【ソースコード】 [tips0029_41.pas]
program tips0029_41;
{$APPTYPE CONSOLE}
uses SysUtils;
var s1,s2:PChar;
begin
 s1:='ホームページ';
 GetMem(s2,256);
 try
   StrMove(s2,s1+2,3);
   StrCopy(s2+6,#0);
   WriteLn(string(s2));
 finally
   FreeMem(s2);
 end;
end.
【コンパイル&実行】 [tips0029_41.bat]
dcc32 tips0029_41.pas 
tips0029_41.exe  > tips0029_41.txt
pause
【実行結果】 [tips0029_41.txt]
ムペー
<参考:string型の場合> 【ソースコード】 [tips0029_42.pas]
program tips0029_42;
{$APPTYPE CONSOLE}
uses SysUtils,StrUtils;
var s:string;
begin
 s:='ホームページ';
 WriteLn(MidStr(s,3,3));
end.
【コンパイル&実行】 [tips0029_42.bat]
dcc32 tips0029_42.pas 
tips0029_42.exe  > tips0029_42.txt
pause
【実行結果】 [tips0029_42.txt]
ムペー
◆ヌルで終わる文字列を検索する (AnsiStrPos関数を使用します) 【ソースコード】 [tips0029_51.pas]
program tips0029_51;
{$APPTYPE CONSOLE}
uses SysUtils;
var s1,s2:PChar;
begin
 s1:='あいうえお';
 s2:='え';
 WriteLn('「',s1,'」の中で「',s2,'」は ',IntToStr(AnsiStrPos(s1,s2)-s1+1),' 文字目にあります');
end.
【コンパイル&実行】 [tips0029_51.bat]
dcc32 tips0029_51.pas 
tips0029_51.exe  > tips0029_51.txt
pause
【実行結果】 [tips0029_51.txt]
「あいうえお」の中で「え」は 4 文字目にあります
<参考:string型の場合> 【ソースコード】 [tips0029_52.pas]
program tips0029_52;
{$APPTYPE CONSOLE}
uses SysUtils;
var s1,s2:string;
begin
 s1:='あいうえお';
 s2:='え';
 WriteLn('「',s1,'」の中で「',s2,'」は ',IntToStr(AnsiPos(s2,s1)),' 文字目にあります');
end.
【コンパイル&実行】 [tips0029_52.bat]
dcc32 tips0029_52.pas 
tips0029_52.exe  > tips0029_52.txt
pause
【実行結果】 [tips0029_52.txt]
「あいうえお」の中で「え」は 4 文字目にあります
◆ヌルで終わる文字列を比較する (AnsiStrComp、AnsiStrIComp関数を使用します) 【ソースコード】 [tips0029_61.pas]
program tips0029_61;
{$APPTYPE CONSOLE}
uses SysUtils;
var s1,s2:PChar; i:Integer;
begin
 s1:='ABC';
 s2:='abc';
 i:=AnsiStrComp(s1,s2);
 WriteLn('「',s1,'」と「',s2,'」は');
 if i=0 then
  WriteLn('→同じ文字列です。')
 else if i>0 then
  WriteLn('→「',s1,'」>「',s2,'」')
 else
  WriteLn('→「',s1,'」<「',s2,'」');
end.
【コンパイル&実行】 [tips0029_61.bat]
dcc32 tips0029_61.pas 
tips0029_61.exe  > tips0029_61.txt
pause
【実行結果】 [tips0029_61.txt]
「ABC」と「abc」は
→「ABC」>「abc」
<参考:string型の場合> 【ソースコード】 [tips0029_62.pas]
program tips0029_62;
{$APPTYPE CONSOLE}
uses SysUtils;
var s1,s2:string; i:Integer;
begin
 s1:='ABC';
 s2:='abc';
 i:=AnsiCompareStr(s1,s2);
 WriteLn('「',s1,'」と「',s2,'」は');
 if i=0 then
  WriteLn('→同じ文字列です。')
 else if i>0 then
  WriteLn('→「',s1,'」>「',s2,'」')
 else
  WriteLn('→「',s1,'」<「',s2,'」');
end.
【コンパイル&実行】 [tips0029_62.bat]
dcc32 tips0029_62.pas 
tips0029_62.exe  > tips0029_62.txt
pause
【実行結果】 [tips0029_62.txt]
「ABC」と「abc」は
→「ABC」>「abc」
◆ヌルで終わる文字列の大文字・小文字変換を行う (AnsiStrUpper、AnsiStrLower関数を使用します) 【ソースコード】 [tips0029_71.pas]
program tips0029_71;
{$APPTYPE CONSOLE}
uses SysUtils;
var s:PChar;
begin
 s:='ABCabcABCabc';
 WriteLn(s,'=>');

 //WriteLn('小文字変換:',AnsiStrLower(s)); //私の環境ではエラーが発生し正常に動作せず
 //WriteLn('大文字変換:',AnsiStrUpper(s)); //私の環境ではエラーが発生し正常に動作せず

 // しかたないので、stringにキャストして変換しています。

 WriteLn('小文字変換:',AnsiLowerCase(string(s)));
 WriteLn('大文字変換:',AnsiUpperCase(string(s)));

end.
【コンパイル&実行】 [tips0029_71.bat]
dcc32 tips0029_71.pas 
tips0029_71.exe  > tips0029_71.txt
pause
【実行結果】 [tips0029_71.txt]
ABCabcABCabc=>
小文字変換:abcabcabcabc
大文字変換:ABCABCABCABC
<参考:string型の場合> 【ソースコード】 [tips0029_72.pas]
program tips0029_72;
{$APPTYPE CONSOLE}
uses SysUtils;
var s:string;
begin
 s:='ABCabcABCabc';
 WriteLn(s,'=>');
 WriteLn('小文字変換:',AnsiLowerCase(s));
 WriteLn('大文字変換:',AnsiUpperCase(s));
end.
【コンパイル&実行】 [tips0029_72.bat]
dcc32 tips0029_72.pas 
tips0029_72.exe  > tips0029_72.txt
pause
【実行結果】 [tips0029_72.txt]
ABCabcABCabc=>
小文字変換:abcabcabcabc
大文字変換:ABCABCABCABC