ヌル文字で終わる文字列を操作する例として下記の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('小文字変換:',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
Copyright c 2009, ohishi,All rights reserved.