CString型からCha型についてr


リダイヤル  2006-04-25 16:51:54  No: 61422  IP: 192.*.*.*

環境は.net、XPです。

CString型からChar型の変換ですが、
 
   CString str = "test";

    char *p = new char[str.GetLength()+1];
    strcpy( p, str );

    delete [] p;

以外に方法は無いのでしょうか?
初歩的な質問で申し訳ありませんが、教えてください。

編集 削除
Blue  2006-04-25 17:22:05  No: 61423  IP: 192.*.*.*

> Cha型
とは?

> CString型からChar型の変換ですが、
C言語では大文字小文字を区別します。Char型とchar型は別ものになります。
(一般的に VC で Char型 というと C++/CLI の System::Char を指すんでしょうかね)

CStringのGetBufferやGetBufferLengthメソッドについて調べてみてください。
ただし、これらを呼び出したあとには、ReleaseBufferが必須になります。

編集 削除
中身をとる方法(GetBuffer)はあ  2006-04-25 17:25:01  No: 61424  IP: 192.*.*.*

もっと具体的に何がしたいんですか?
参照できさえすればいいのか、
CStringの課髪は変えたくないけど、取得した文字列には変更加えてしまうから別のバッファにとりたいのか等…

編集 削除
中身をとる方法(GetBuffer)はあ  2006-04-25 17:26:56  No: 61425  IP: 192.*.*.*

課髪は中身の入力ミスです…

編集 削除
Blue  2006-04-25 17:43:50  No: 61426  IP: 192.*.*.*

別バッファにほしいならば、_tcsdup関数を使うとか。

CString str( _T( "test" ) );
TCHAR* p = _tcsdup( str );

delete [] p;

編集 削除
Blue  2006-04-25 17:46:14  No: 61427  IP: 192.*.*.*

> delete [] p;
あ、これ間違いかも。_tcsdupってmallocだったと思うので

free( p );

ですかね。(微妙)

編集 削除
通りすがり  2006-04-25 17:48:13  No: 61428  IP: 192.*.*.*

T2Aマクロ使うとか

編集 削除
Blue  2006-04-25 17:53:31  No: 61429  IP: 192.*.*.*

> T2Aマクロ使うとか
ああ、そうでした。TCHAR型ではなくて、char型がほしいんでしたね。

編集 削除
Pink  2006-04-25 19:34:55  No: 61430  IP: 192.*.*.*

もし、CString型 → char型なら、ごくごく単純に

char mych[];
CString ss;
strcpy( mych , (const char *) ss );

では、だめなのでしょうか。

編集 削除
Blue  2006-04-25 20:48:58  No: 61431  IP: 192.*.*.*

> char mych[];
サイズを指定しないとコンパイルエラーですよ。

編集 削除
Pink  2006-04-26 02:15:22  No: 61432  IP: 192.*.*.*

> サイズを指定しないとコンパイルエラーですよ。

誤解を招く書き方でした。
意味は通じるかと思ったのですが。。。。

CString ss = "子だぬき";
char mych[10];
strcpy( mych , (const char *) ss );

mych[10]は"子だぬき"

編集 削除
Blue  2006-04-26 08:41:15  No: 61433  IP: 192.*.*.*

CString ss = "子だぬき子だぬき子だぬき子だぬき"
の場合はどうしますか?
この状態で strcpy をするとやばいことはわかりますよね?

だから、格納文字列数+1でnewする必要があるのです。
(多めに用意しても、それ以上の文字列がある可能性は否定できません)

編集 削除
通りすがり  2006-04-26 09:09:42  No: 61434  IP: 192.*.*.*

自分だったら、怖いからそれに加えてコピーもstrncpyにするかな

編集 削除
Ban  2006-04-26 09:29:29  No: 61435  IP: 192.*.*.*

別のアプローチとして、
参照のために const char* が欲しいなら、operatorがいます。
APIに渡すなど「変更したくて」char* が欲しいなら GetBuffer 等が使えます。

Cの駄目ソースなど、参照だけだろうに const になっていないようなやつに渡す時は、
何されるか分からないし危険なので、あきらめてコピーします。

# const_cast とかはやらない方がいいです。

編集 削除