CStringからchar*への変換 – プログラミング – Home

通知
すべてクリア

[解決済] CStringからchar*への変換


ふぁいん
 ふぁいん
(@ふぁいん)
ゲスト
結合: 18年前
投稿: 15
Topic starter  

環境: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 );


引用未解決
トピックタグ
ふぁいん
 ふぁいん
(@ふぁいん)
ゲスト
結合: 18年前
投稿: 15
Topic starter  

すみません。間違いがありました。

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


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

# また、この手の質問ですな。

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
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

ちなみに、
>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);


返信引用
ふぁいん
 ふぁいん
(@ふぁいん)
ゲスト
結合: 18年前
投稿: 15
Topic starter  

出来ました。ありがとうございました。
アドバイスして頂いた通り、TCHAR型を使ってみます。
丁寧に解説して頂き、とても感謝しています。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました