NULL文字列について

解決


久しぶりに使います  2013-12-06 21:19:05  No: 45679

現在本を読んで仕様を再確認しています。
(今までは適当につくってもなんとか動いていました)
文字列のところで、NULLで終わる文字列は、演算子を使って代入したり、比較したり、連結したりすることはできませんと書いてあるのを見つけました。

TStringList、文字列の配列、文字列のレコード、これはすべてNULLで終わるんですか?
(プログラムでどれをおもに使うか悩んでいます)
NULLで終わらない文字列って、何があるんでしょうか?


DEKO  2013-12-06 23:51:46  No: 45680

TStringList も 文字列の配列も文字列のレコードも文字列ではありません。

> NULLで終わらない文字列
Delphi の String はヌルで終わりません。文字列の途中に NULL を含める事ができます。但し、内部構造としては "文字列の後に" NULL が付加されています。

[Delphi 2009 と 文字列型 (EDN)]
http://edn.embarcadero.com/jp/article/38791


久しぶりに使います  2013-12-07 05:10:44  No: 45681

DEKOさん、回答ありがとうございます。

ごめんなさい、書き方が悪かったみたいです。

プログラム中で、ソート(TStringListのソートではない方法で)したり、他の変数に配列とかTStringListの一部をコピーしたりしようと思っています。
その時に、どの形式のデータだったらA := B  という形でコピーできるのかお聞きしたかったのです。

やはり、どれもStrComp、StrCpy、StrCatを使う必要があるんでしょうか?


DEKO  2013-12-07 05:54:20  No: 45682

> 書き方が悪かったみたいです。
...えーと。

> どれもStrComp、StrCpy、StrCatを使う必要があるんでしょうか?
どこをどう読んだらこういう質問だと受け取れるのでしょうか?

> A := B
String 配列の一部というのは String 型であり、
TStringList の一部もやはり String 型です。

コピー元が String である以上、何を使うのかは "コピー先の型" に
依存するというだけの話なのではないでしょうか?

例えば AnsiString (変数 A) を UnicodeString (変数 U) に代入する場合には、
U := A;
だけで済みます。これは暗黙の型変換が行われているからです。

String 型の変数を PChar として扱うには、
P := PChar(S);
のようにできますし、逆に PChar が指すアドレスに格納された文字列は、
S := StrPas(P);
のようにしてコピーできます (最近の Delphi は単に代入だけで OK)。


久しぶりに使います  2013-12-07 17:37:18  No: 45683

回答ありがとうございます。
>String 型の変数を PChar として扱うには、
>P := PChar(S);
>のようにできますし、逆に PChar が指すアドレスに格納された文字列は、
>S := StrPas(P);
>のようにしてコピーできます (最近の Delphi は単に代入だけで OK)。

「Delphi XE2プログラミング入門」というほんを見ていたら、P48に
NULLで終わる文字列はStrComp、StrCpy、StrCatを使う必要があるということが書かれていたものですから、
どれとどれがNULLで終わらない、代入ですむ変数か確認したかったのです。

すべて代入でOKなら、助かります。


DEKO  2013-12-07 23:11:36  No: 45684

>「Delphi XE2プログラミング入門」というほんを見ていたら、P48に
> NULLで終わる文字列はStrComp、StrCpy、StrCatを使う必要があるということが書かれていたものですから、
> どれとどれがNULLで終わらない、代入ですむ変数か確認したかったのです。

どれが NULL 終端の文字列で、どれが NULL 終端でないのかは最初の投稿のリンク先にあった通りです。

> TStringList、文字列の配列、文字列のレコード

これらは NULL 終端の文字列ではないので、"NULL 終端文字列を操作する関数" を使う必要はありません。
文字列操作の概要についてはドキュメントを確認してみてください。

[文字列の操作 (DocWiki)]
http://docwiki.embarcadero.com/RADStudio/ja/%E6%96%87%E5%AD%97%E5%88%97%E3%81%AE%E6%93%8D%E4%BD%9C


DEKO  2013-12-07 23:33:15  No: 45685

> これらは NULL 終端の文字列ではない

文字列の配列や文字列のレコードについては、
仰っている "文字列" というのが Delphi でいう所の "文字列" だった場合です。
(String / UnicodeString / AnsiString...)

var
  S: array [0..10] of string;
  SL: TStringList;

この時、S[0] は Delphi の長い文字列 (String) で、NULL 終端ではありません。
SL[0] や、SL.Text も長い文字列 (String) です。

var
  P: array [0..10] of PChar;

これは  NULL 終端文字列へのポインタの配列です。
P[0] は NULL 終端文字列へのポインタとなりますので、
PChar 同士の文字列操作には  "NULL 終端文字列処理ルーチン" を使う必要があります。


久しぶりに使います  2013-12-09 06:01:17  No: 45686

DEKOさん、ありがとうございます。
ご紹介のサイトわかりやすそうです。
これを参考に作っていきます。


久しぶりに使います  2013-12-09 15:54:52  No: 45687

チェック忘れてました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加