CStringからchar*への変換

[戻る]
ふぁいん 2006/12/04(月) 11:20:52
環境:WinXp(SP2) VC++2005.net(MFC)

MSDNの「さまざまな文字列型間で変換する」に載っていたサンプルを実行したのですが、
エラーが出てしまいます。
どのように対処したらよろしいのでしょうか?

CString orig("Hello, World!");

// Convert to a char*
const size_t newsize = 100;
char nstring[newsize];
strcpy_s(nstring, fileName);

<エラー内容>
error C2665: 'strcpy_s' : 2 オーバーロードのどれも、すべての引数の型を変換
できませんでした

上記のやり方に限らず、変換できれば何でも構いません。
よろしくお願いします。

以前の環境(WinXp(SP2) VC++ Ver.6(MFC))では以下のコードでOKでしたが、
.netでは、2byte文字とか仕様が変わっているようで、いろいろ調べたのですが
結局できませんでした。(T_T)

CString orig("Hello, World!");
char* nstring;
nstring = new char[ orig.GetLength() + 1 ];
strcpy( nstring, orig );

ふぁいん 2006/12/04(月) 11:24:30
すみません。間違いがありました。

(誤)strcpy_s(nstring, fileName);
      ↓
(正)strcpy_s(nstring, orig);

Blue 2006/12/04(月) 11:36:00
# また、この手の質問ですな。

VC2005から、コンパイルオプションが変更されています。

>CString orig("Hello, World!");
の場合、CStringクラスの内部では 'TCHAR'型 で文字列を持っているのがポイントで
す。

で、TCHARってのは調べてもらえばわかると思いますが、

文字セットに「Unicode文字セット」を指定すると wchar_t 型に
文字セットに「マルチバイト文字セット」を指定すると char 型に

なります。

で、CStringクラスには operator LPCTSTR () というのがあり、
これも、文字セットによって LPWSTR と LPCSTR と変換されます。

VC2005から、この「文字セット」のデフォルトが、以前までの「マルチバイト文字セッ
ト」から「Unicode文字セット」に変更されています。

よって
>strcpy_s(nstring, orig);
の場合、styrcpy_sで、const char* 型を欲しているが、CStringに operator LPCSTR型
がないため、エラーとなるのです。

対処方法としては、
・前述のとおりコンパイルオプションを変更する(※)
・nstringやstrcpy_sをTCHAR対応にする
・nstringやstrcpy_sをwchar_t対応にする
・origをconst char*に変換する処理を入れる
のいずれかになります。
(※)このオプションを変更すると、manifestファイルのところでエラーがでます。
    別途対応する必要があります。
    http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=275243&SiteID=7

普通に考えると TCHAR型 を使うようにしたほうがよいでしょう。

Blue 2006/12/04(月) 11:40:34
ちなみに、
>CString orig("Hello, World!");
>char* nstring;
>nstring = new char[ orig.GetLength() + 1 ];
>strcpy( nstring, orig );

strcpy_s の場合、第一引数にchar型配列を渡す場合はそのままでいいのですが、
char*型を渡す場合、第二引数にサイズを渡すstrcpy_sを使わなければなりません。
(実際になんでそうなるのかは、strcpy_sのヘルプを見てください)

char* orig = "Hello, World";
char* nstring

nstring = new char[strlen(orig) + 1];
strcpy_s(nstring, strlen(orig) + 1, orig);

ふぁいん 2006/12/04(月) 11:59:54
[[解決]]
出来ました。ありがとうございました。
アドバイスして頂いた通り、TCHAR型を使ってみます。
丁寧に解説して頂き、とても感謝しています。

古いスレッドには追加発言できません。