CString型からCha型についてr


リダイヤル  2006-04-26 01:51:54  No: 61422

環境は.net、XPです。

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

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

    delete [] p;

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


Blue  2006-04-26 02:22:05  No: 61423

> Cha型
とは?

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

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


中身をとる方法(GetBuffer)はあ  2006-04-26 02:25:01  No: 61424

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


中身をとる方法(GetBuffer)はあ  2006-04-26 02:26:56  No: 61425

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


Blue  2006-04-26 02:43:50  No: 61426

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

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

delete [] p;


Blue  2006-04-26 02:46:14  No: 61427

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

free( p );

ですかね。(微妙)


通りすがり  2006-04-26 02:48:13  No: 61428

T2Aマクロ使うとか


Blue  2006-04-26 02:53:31  No: 61429

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


Pink  2006-04-26 04:34:55  No: 61430

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

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

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


Blue  2006-04-26 05:48:58  No: 61431

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


Pink  2006-04-26 11:15:22  No: 61432

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

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

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

mych[10]は"子だぬき"


Blue  2006-04-26 17:41:15  No: 61433

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

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


通りすがり  2006-04-26 18:09:42  No: 61434

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


Ban  2006-04-26 18:29:29  No: 61435

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

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

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


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

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






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