あの、C言語の場合、文字入力して配列に格納したとき、
最後に'\0'が付属して格納されますが、Delphiも同様に何か最後に
格納されるんですか?すみませんが教えていただけないでしょうか?
勉強不足ですみません。
PCHARとchar*が同等です。
char*型に持たせた文字列と、PCHAR型に持たせた文字列の最後は同じように'\0'(Delphiでは#0)が入っています。
>C言語の場合、文字入力して配列に格納したとき、
>最後に'\0'が付属して格納されますが
必ず最後に'\0'が格納されるとはかぎってへんで
勉強以前の問題やなぁ
質問もなっとらんし
Cの場合は終了を確認するのにヌルコードを使うのが
一般的で、Delphi では String 使うと文字数を
別に保持してるんで必要ないっちゅうことや
「型」ってもんを勉強しなはれ!
地獄の魔人さんに補足すると、
> 必ず最後に'\0'が格納されるとはかぎってへんで
DOSのBIOSコールの場合は'$'が文字列の最後につきます。
> PCHAR型に持たせた文字列の最後は同じように'\0'(Delphiでは#0)が入っています。
この意味が理解できないのですが。string 型をキャストした場合はたしかにそうですが、
必ずしもそのような場合ばかりではない、と思うのですが。
> この意味が理解できないのですが。
質問者の内容が、C言語の文字列ということでした。
C言語には文字列型は存在しません。
ので、ここでいう文字列=charへのポインタとして解釈しました。
そういう意味で、PCHARを引き合いに出しています。
具体的に、
var
p: PCHAR;
begin
p := 'ABC';
この場合、(p+3)^は#0です。
このことしか私は触れていません。
他にも(例えば#0で終わらない)パターンが考えられるかもしれません。
> 必ずしもそのような場合ばかりではない、と思うのですが。
後学のため、できれば、その例を教えていただけませんか?
文字列を扱っているという前提で、文字列の最後が#0でないパターンが思いつきませんでした。
もちろん、
var
p: PCHAR;
begin
p := GetMemory(3);
CopyMemory(p, 'ABC', 3);
こういうのはわかりますが、これは文字列ではありませんし。
> 文字入力して配列に格納したとき、
素朴に考えると
> ここでいう文字列=charへのポインタとして解釈しました。
ですから
procedure TForm1.Button1Click(Sender: TObject);
var
c: array[0..2] of Char;
p: PChar;
begin
c[0] := 'A'; c[1] := 'B'; c[2] := 'C';
p := @c[0];
Caption := IntToHex(byte((p+3)^),2);
end;
地獄の魔人さんwrote
>Cの場合は終了を確認するのにヌルコードを使うのが
>一般的で、Delphi では String 使うと文字数を
>別に保持してるんで必要ないっちゅうことや
>「型」ってもんを勉強しなはれ!
Pascalでは文字列は「文字数を別に保持してる」というのは仕様ですが
DelphiでStringの最後に#0がつくのも仕様です。
C言語等とやり取りするのに便利な様に(PCharでキャストできる様に)Stringとして確保した場合は文字列の最後に#0が付加されます
junkiさんへ。
その例で言うならば、そもそも
> 文字入力して配列に格納したとき、
> 最後に'\0'が付属して格納されますが
最後に'\0'は入りません。C言語でも。
そこを指摘すべきでは?
私も見過ごしていましたが、'\0'が入るということで「文字入力」=「文字列入力」と読み取っていました。
# getcでなく、getsかscanf関数あたりかと・・・
確かに文字の配列と文字列は別物ですね。
おはようございます。
> そこを指摘すべきでは?
そうですね。質問が変なのです。地獄の魔人さんとにしのさんが指摘されていますように、末尾にヌルが来るというのは、なにか外部的な要因なのであって、型に依存する部分ではないのですね。Delphi の PChar は、素朴に考えれば Char へのポインタである以上の意味は本来ないはずなのですよね。Win32 API の実装言語であった C と簡単にインタフェースが取れるように自動的にヌル止めをするように実装されているのは、便利機能ではありますけど。
>「型」ってもんを勉強しなはれ!
C言語を勉強し直します!!
ツイート | ![]() |