• ベストアンサー

CStringをwchar_tに変換したい

CStringをwchar_tに変換したく思い、ネットで探したところ、 http://msdn2.microsoft.com/ja-jp/library/ms235631(VS.80).aspx のページを見つけたので、下記のプログラムを組んで実行してみましたがエラーになって しまいます。 【プログラム】 CString orig("Hello, World!"); // Convert to a char* const size_t newsize = 100; // Convert to a wchar_t* // You must first convert to a char * for this to work. size_t origsize = strlen(orig) + 1; size_t convertedChars = 0; wchar_t wcstring[newsize]; mbstowcs_s(&convertedChars, wcstring, origsize, orig, _TRUNCATE); 【エラー】 error C2664: 'strlen' : 1 番目の引数を 'CString' から 'const char *' に変換できません。 error C2664: 'mbstowcs_s' : 4 番目の引数を 'CString' から 'const char *' に変換できません。 &CStrinをconst char *でキャストしてもうまくいきません。 どこがおかしいのでしょうか? 【環境】 WindowsXP+VC++2005

質問者が選んだベストアンサー

  • ベストアンサー
noname#88356
noname#88356
回答No.2

CStringはTCHAR *です。つまりVSがマルチバイト設定ならchar *ですし、 ユニコード設定ならWCHAR *(wchar_t *と同じです)になります。 仮にWCHAR *型に変換したいのなら CString cStr = "元の文字列"; //cStr.GetString()はTCHAR *型 CStringW wideStr = cStr; //wideStr.GetString()はWCHAR *型 の様に一度CStringWを介した方が楽だと思います。 参考までに CString ・・・GetString()で得られる型はTCHAR * CStringA ・・・GetString()で得られる型はchar * CStringW ・・・GetString()で得られる型はWCHAR *

その他の回答 (1)

回答No.1

size_t origsize = strlen(static_cast<const char*>(orig))+1; ※ ただしUNICODEモードでコンパイル"しないこと"

関連するQ&A

  • CString型からdouble型への変換

    C++は初心者です。VC4.0を使っていますがMFCなどは使っていません。 CString型の変数をint型やlong型への変換はなんとかできたのですが、double型へ変換することができずに困っています。atofを使えばいいのだと思い下記のように記述したのですが、コンパイルするとエラーがでます。   CString sample = "0.234";   double i;   i = atof((const char*)sample); error C2440: 'type cast' : cannot convert from 'class CString' to 'const char *' どう直せば無事にdouble i に0.234を格納できるのでしょうか?よろしくお願いします。

  • VC++2005で、CString型に16進文字列を入れたいのですが・・

    VC++2005で、CString型に16進文字列を入れたいのですが・・・ 次のようなエラーが出ます。 void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)' : 1 番目の引数を 'const char [5]' から 'const wchar_t *' に変換できません。 プログラムは次の通りです。 CString strBuff; CString strWork; TCHAR tszBuff[80]; UINT unLength; UINT un1; unLength = 5; strBuff = "12345"; _tcscpy(tszBuff, strBuff); strWork = ""; for(un1 = 0; un1 < unLength; un1++) { strWork = strWork + strBuff.Format("%02x", tszBuff[un1]); ←ここにエラーがあると言われています。 } 結果は、strWorkに、"3132333435"となるようにしたい! ネットで探したら、 >UNICODEを使われているのだと思われます。 >T("")マクロを使ってワイドキャラクタに変換するように指示すれば動くと思います。 とあったので、 strWork = strWork + strBuff.Format(_T("%02x"), tszBuff[un1]); としてみたのですが、 二項演算子 '+' : 型 'void' の右オペランドを扱う演算子が見つかりません (または変換できません)。 というエラーが表示されました。 VC++6.0を半年かじり、今日、初めてVC++2005に触った程度の初心者です。 どなたか助言を頂ければ幸いです。 環境  Windows XP Pro SP3  Visual C++ 2005(MFC) 以上、よろしくお願いします。

  • VC++にてCString型のフルパスをfopenする

    VC++(VisualStudio2005)にてCString型のフルパスをfopenしたいと思っています。 他ページでは char *name = new char[filepass.GetLength()+1]; strcpy( name, filepass ); でstrcpyでCstring→charへ変換できるとあったのですが、 'strcpy' : 2 番目の引数を 'CString' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照) 1> この変換を実行可能なユーザー定義変換演算子がないか、または演算子を呼び出せません。 というエラーをはいて実行できませんでした。 lstrcpy(name, filepass)でも 1 番目の引数を 'char [100]' から 'LPWSTR' に変換できません。(新しい機能 ; ヘルプを参照) 1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 となりました。 何か良い方法をご存じないですか? char型に変換できなくとも、結果的にfopenを使ってファイルオープンできれば良いです。

  • CStringについて

    CStringにおいてFindではエラーが出ないのに、ReverseFindだとエラーがでます。 error C2664: 'ReverseFind' : 1 番目の引数を 'char [4]' から 'char' に変換できません。 (新しい機能 ; ヘルプを参照) この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。 キャストするとエラーは出ませんが文字列の検索は失敗してしまいます。 Findはまったく問題無いのにどうしてこのようなことが起きるのでしょう? どう対処すれば良いか教えてください。 CString ddd; ・ ・ nn=ddd.Find("DOW");     ←エラーなし nn=ddd.ReverseFind("DOW"); ←エラーあり 環境はWIN98 VC++6.0 MFCです。

  • CString から LPCTSTRの型に変換

    visual studio 2013 VC++を使用していますが、WINDOWSの関数に渡すためにCString からLPCTSTRに変換する必要があります。実際にどのようにするのかわかりません。 例えば、以下のサンプルは他の質問コーナーの回答をアレンジしたものです CString str = _T("ABC"); int siz = str.GetLength()+1; LPCTSTR pszFName = new TCHAR[siz]; _tcscpy_s( pszFName, siz, str ); で変換するのですが LPCTSTRからwchar_t*へ変換できませんとエラーがでます _tcscpy_s()は使用できないのでしょうか

  • Cstring(日本語含む)をcharに変換したいのですが

    日本語を含む文字列が格納されたCstringをcharに変換したく 以下のプログラムを作成しましたがwcstombs_s() でエラーに なってしまいます。(戻り値が EILSEQ) どうしたらいいか、アドバイスをいただけないでしょうか? CString csPass("Testテスト"); char cName[512]; size_t sz = 0; errno_t err; err= wcstombs_s(&sz, cName, sizeof(cName), csPass.GetString(), _TRUNCATE); if(0 != err){ return; } 【環境】 WindowsXP VC++2008

  • 変換できない

    現在C言語で簡単な顧客管理システムを作っていますが、どうしても解決できないエラーがありますので、質問させていただきます。 エラー内容は以下のようなものです。 cpp(334) : error C2664: 'strlen' : 1 番目の引数を 'int' から 'const char *' に変換できません。 334行目のソースは、 if(strlen(iBanngou) == 0) です。変数iBanngouは、gets(x)のxをstrlen関数を使って、xの長さをint型のiBanngouに代入したものです。iBanngouをいろいろエラー判定にかけ、何事もなかったらint touroku(DATE *pstr, int *hako, int *hako2)に格納する仕組みになっております。 どのように修正すれば良いか、ご教授していただけるとありがたいです。何卒よろしくお願い致します。

  • 標準関数strlenの型size_tがわからない

    標準関数strlenの型size_tがわかりません int a; char ss[80]; . . . a = (int)strlen( ss ); とやってもコンパイルエラーです 型違いのようです。 調べたのですがsize_t型なんて知りません。 なぜですか(size_t型って何でしょうか)? どうすれば使えるのでしょうか? 宜しくお願い致します

  • LoadLibraryでのエラーについて2

    ”ifjpeg.spi”というDLLファイルをよびだすプログラムを作成して、ビルドしたところエラーがでました。 HINSTANCE hSPI = LoadLibrary( gPluginFiles[i] ); この行では次のようなエラーが出ました。 [BCC32 エラー] Unit1.cpp(53): E2034 'const char *' 型は 'const wchar_t *' 型に変換できない [BCC32 エラー] Unit1.cpp(53): E2342 パラメータ 'lpLibFileName' は const wchar_t * 型として定義されているので const char * は渡せない ”gPluginFiles”については次のように宣言しています。 const char *gPluginFiles[] = { "ifjpeg.spi",NULL, }; このプログラムのエラーの解決方法を教えて頂けませんでしょうか? 使用している開発環境はCode Gear C++ Builder 2009 です。

  • テンプレートが複雑すぎる?

    以下のような文字列比較関数を作ろうと思っています。 ○配列変数であるときは配列版を、そうでないときはポインタ版を呼び出す  配列のサイズがわかるときは、仮に\0で終端していなくてもそれ以上検索しない ○charかwchar_tかを意識せずに使える ○charとwchar_tという記述ではなく、templateでできるだけジェネリック?的に記述したい //charを入れるとwchar_t、wchar_tを入れるとcharを返すメタ関数 template<typename T> struct invert{}; template<> struct invert<char>{ typedef wchar_t t; }; template<> struct invert<wchar_t>{ typedef char t; }; //同じ型同士の比較は省略 //A: 両方ポインタ template<typename T> bool compare(const T *const &v1, const typename invert<T>::t *const &v2); //B1: 左がポインタ、右が配列 template<typename T, size_t L> bool compare(const T *const &v1, const typename invert<T>::t (&v2)[L]); //B2: Tとtypename invert<T>::tを逆に template<typename T, size_t L> bool compare(const typename invert<T>::t *const &v1, const T (&v2)[L]); //C: 左が配列、右がポインタ //省略 //D: 両方配列 template<typename T, size_t L1, size_t L2> bool compare(const T (&v1)[L1], const typename invert<T>::t (&v2)[L2]); char aa[] = "abc"; char *pa = aa; wchar_t aw[] = L"abc"; wchar_t *pw = aw; bool c1 = compare(pa, pw); //A bool c2 = compare(pa, aw); //B1はC2784, B2なら可 bool c3 = compare(aa, pw); //C bool c4 = compare(aa, aw); //DはC2784 invert<T>::t (&v2)[L]という記述が複雑?なのかB1は呼べず、B2と記述すると通りました。 しかしDはどちらも配列であるため、B2のように回避できません。 オーバーロードを全て記述せずに、できるだけ簡単にすます方法はありませんか? 環境はVC++2010です。

専門家に質問してみよう