またまたすいません。
「ゼロで初期化された文字列のサイズを知るには?」(http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200712/07120004.txt)でお世話になったものです。
みなさんのおかげで、動的メモリを使った文字列の引渡しなどが、全く問題なく行えるようになりました。重ねてお礼申し上げます。(ペコリ
ひとつ疑問に思ったことが(いつもですが(汗;;))ありまして、
例えば、文字列を返してもらうことを想定して関数を呼び出すとき
int GetString(LPTSTR szBuffer, UINT cbBuffer);
という風にして、文字列を格納するバッファのアドレスと、そのサイズを関数に知らせてあげる。これは前の質問で理解できました。
でも、逆の場合、文字列を関数に渡す場合
int SetString(LPCTSTR szBuffer);
こういう風になってることが多いですよね?
これってCONSTキーワードがついている文字列は、NULL終端文字が最後についているものとして扱われるってことなんでしょうか?
よく文字列変数を、(LPCTSTR)でキャストしてどこかに渡すということを行いますが、キャストすると最後にNULL文字がつくんでしょうか?
何度も何度もすみません。
constは関係ない。
C言語の文字列のお約束かな。
SetStringの説明書にNULL終端の文字列と書いておいたほうがいいのだろうけど、
型名にSTRがついていることから説明しなくてもわかるだろうっていうことかもしれない。
そういう意味では変数名のszBufferはよろしくないな。
ポインタのキャストは、キャストしてもポインタの指している先のデータが変わることはないよ。
演算子のオーバーロードしてたらどうかわからんけど。
>そういう意味では変数名のszBufferはよろしくないな。
szがzero終端stringって意味かな
見逃してた。
>int GetString(LPTSTR szBuffer, UINT cbBuffer);
これもszがついているから0終端文字列を
szBufferが示すバッファに入れてくれって意味になる。
szとかがついてなくてもC/C++といえば0終端文字列だな。
一部そうじゃないものもあるけど。
size_t strlen(const char *s); のように const が使われているときの意味は
「この関数は渡されたポインタの示す先を変更しない」
ということだ。
char *strcpy(char *dst, const char *src); であれば
dst : const が無い=ポインタの指す先を変更する
src : const がある=ポインタの指す先を変更しない
>キャストすると最後にNULL文字がつくんでしょうか?
それ以上の意味は無いので \0 で終端されているか否かは関係ない。
const があるからといって \0 が付加されるなんてことも無い。
memcpy(void* dst, const void* src, size_t sz);
などを考えてみればいい。勝手にそんなことをされては困る。
C++ では C でできないことがいくつかできるようになっているので
>演算子のオーバーロードしてたらどうかわからんけど。
のようなことができるがまあ例外ということで今は知らんでもよさそう。
> szがzero終端stringって意味かな
"Separated by Zero" の略だとか聞いたことがあります。
ハンガリアン表記を作った(人がいる)Microsoftのサイトでの説明
http://msdn2.microsoft.com/en-us/library/aa260976(VS.60).aspx
sz Pointer to first character of a zero terminated string.
>これってCONSTキーワードがついている文字列は、NULL終端文字が最後についているものとして扱われるってことなんでしょうか?
->いいえ。 const修飾された識別子が呼び出された関数内で
変更されないことが宣言(ある意味で保障)されます。
質問の内容の場合、引数となった文字列の内容が変更
されないことが宣言されています。
>よく文字列変数を、(LPCTSTR)でキャストしてどこかに渡すということを行いますが、キャストすると最後にNULL文字がつくんでしょうか?
->いいえ。 一般にLPCTSTRのような「旧来の単純なキャスト」は型を
読み替えるだけで、キャスト対象となる変数の内容には
影響が無く、「コンパイラの警告が消える」という効果が
期待できます。
また、C++言語で正しいキャストを行うには static_cast /
reinterpret_cast / const_cast / dynamic_cast
を使用します。
ツイート | ![]() |