環境: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 );
すみません。間違いがありました。
(誤)strcpy_s(nstring, fileName);
↓
(正)strcpy_s(nstring, orig);
# また、この手の質問ですな。
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型 を使うようにしたほうがよいでしょう。
ちなみに、
>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);
出来ました。ありがとうございました。
アドバイスして頂いた通り、TCHAR型を使ってみます。
丁寧に解説して頂き、とても感謝しています。