環境は.net、XPです。
CString型からChar型の変換ですが、
CString str = "test";
char *p = new char[str.GetLength()+1];
strcpy( p, str );
delete [] p;
以外に方法は無いのでしょうか?
初歩的な質問で申し訳ありませんが、教えてください。
> Cha型
とは?
> CString型からChar型の変換ですが、
C言語では大文字小文字を区別します。Char型とchar型は別ものになります。
(一般的に VC で Char型 というと C++/CLI の System::Char を指すんでしょうかね)
CStringのGetBufferやGetBufferLengthメソッドについて調べてみてください。
ただし、これらを呼び出したあとには、ReleaseBufferが必須になります。
もっと具体的に何がしたいんですか?
参照できさえすればいいのか、
CStringの課髪は変えたくないけど、取得した文字列には変更加えてしまうから別のバッファにとりたいのか等…
課髪は中身の入力ミスです…
編集 削除別バッファにほしいならば、_tcsdup関数を使うとか。
CString str( _T( "test" ) );
TCHAR* p = _tcsdup( str );
delete [] p;
> delete [] p;
あ、これ間違いかも。_tcsdupってmallocだったと思うので
free( p );
ですかね。(微妙)
T2Aマクロ使うとか
編集 削除> T2Aマクロ使うとか
ああ、そうでした。TCHAR型ではなくて、char型がほしいんでしたね。
もし、CString型 → char型なら、ごくごく単純に
char mych[];
CString ss;
strcpy( mych , (const char *) ss );
では、だめなのでしょうか。
> char mych[];
サイズを指定しないとコンパイルエラーですよ。
> サイズを指定しないとコンパイルエラーですよ。
誤解を招く書き方でした。
意味は通じるかと思ったのですが。。。。
CString ss = "子だぬき";
char mych[10];
strcpy( mych , (const char *) ss );
mych[10]は"子だぬき"
CString ss = "子だぬき子だぬき子だぬき子だぬき"
の場合はどうしますか?
この状態で strcpy をするとやばいことはわかりますよね?
だから、格納文字列数+1でnewする必要があるのです。
(多めに用意しても、それ以上の文字列がある可能性は否定できません)
自分だったら、怖いからそれに加えてコピーもstrncpyにするかな
編集 削除別のアプローチとして、
参照のために const char* が欲しいなら、operatorがいます。
APIに渡すなど「変更したくて」char* が欲しいなら GetBuffer 等が使えます。
Cの駄目ソースなど、参照だけだろうに const になっていないようなやつに渡す時は、
何されるか分からないし危険なので、あきらめてコピーします。
# const_cast とかはやらない方がいいです。