• ベストアンサー

ワイド文字列とコンストラクタ

ワイド文字列(UNICODE)をクラス化しようとしているのですが、 コンストラクタにconst wchar_t*型の引数を持たせて呼び出すと、 コンストラクタに渡された文字列が消えてしまい、wcslen()でサイズを求めると何故かサイズも0になっています。 class WideString { public: WideString(const wchar_t*); … }; WideString::WideString(const wchar_t* ws) { ::OutputDebugString(ws); // ←文字列が消えてる?表示されない int len = wcslen(ws); // ←これが0 } int main(void) { WideString wStr(L"文字列"); … } これは一体どういうことなのでしょうか。どなたか教えてください。

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

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

現象を再現可能なソースコードを補足してください。 std::wstringでできることを、なぜわざわざ作り直すのかも教えてください。

RabbitWrap
質問者

お礼

>std::wstringでできることを、なぜわざわざ作り直すのかも教えてください。 その通りですね。 もともとはstd::wstringにはないJavaのsplit()を実装したくてクラス化しようと思ったのですが、これだけの為にわざわざ作り直すのも確かにおかしいですね。 ご回答ありがとうございました。

その他の回答 (1)

回答No.2

単にロケールを設定していないだけなのでは? キーワード:setlocale

RabbitWrap
質問者

お礼

ロケールの設定はしてあります。 しかし、std::wstringを使用することにいたしました。 ご回答ありがとうございます。

関連するQ&A

  • ワイド文字についてのURLをPlzです

    ワイド文字やUnicodeの文字について詳しいサイトあったら教えてください。 レベル的には #include <stdio.h> #include <wchar.h> int main(){ wchar_t *wc = L"wchar_tワイド文字列でえす。"; fputws(wc, stdout); return 0; } これを実行して、なんで日本語が表示されないのかがさっぱりわからないレベルです。。 お願いします。 (注:教えていただきたいのは、上のプログラムの間違っている箇所でなく、それがわかるようになるようなサイトです。)

  • ワイド文字(列)について

    ワイド文字(列)について質問です。 printf()などより、wprintf()などのワイド文字を扱える関数を 使おうと思っているのですが、うまく表示されません。 何が原因なのでしょうか? ソースです。 #include <stdio.h> int main(void) { wchar_t *data = L"かきくけこ"; wprintf(L"あいうえお\n"); wprintf(L"%s\n", data); return (0); } wprintf(L"%s\n", data);は表示はされるのですが、 「?」になります。 環境 XP Visual Studio 2005

  • ■文字コード判定■

    あるバッファに入っている文字列の文字コード(ANSI、SJIS、UNICODEなど)を判定したいのですが、色々と調べたのですが、解決しませんでした。 ANSIでもUNICODEでもきちんと文字列を扱えるアプリケーションを開発しています、問題となる例です↓ (メッセージボックス) int MessageBox_OK( HWND hWnd, LPCTSTR lpCaption, LPCTSTR lpText ) { int ret; int len_w; LPWSTR wCaption, wText; //変換後の、UNICODE文字列取得バッファ //コンパイル設定がUNICODEの時に、ANSIをUNICODEに変換する #ifdef UNICODE //ここで文字コードを判定したいです|・ω・`) //UNICODEでなかったらUNICODEに変換する len_w = AnsiToUnicode_Size( lpCaption ); len_w = len_w * sizeof(WCHAR); wCaption = (LPWSTR)malloc( len_w + 1 ); AnsiToUnicode_Convert( lpCaption, wCaption ); //ここで文字コードを判定したいです|・ω・`) len_w = AnsiToUnicode_Size( lpText ); len_w = len_w * sizeof(WCHAR); wText = (LPWSTR)malloc( len_w + 1 ); AnsiToUnicode_Convert( lpText, wText ); #else return MessageBox( hWnd, lpText, lpCaption, MB_OK ); #endif return MessageBox( hWnd, wText, wCaption, MB_OK ); } //ANSI→UNICODE (必要サイズ(文字数)) int AnsiToUnicode_Size( LPCSTR strAnsi ); //ANSI→UNICODE (変換) BOOL AnsiToUnicode_Convert( LPCSTR strAnsi, LPWSTR strUnicode ); よろしくお願いします。

  • ワイド文字のバイト数が取得できず困っています。

    ワイド文字のバイト数を求めたいのですが、文字数しか取得することが出来ません。 ワイド文字のバイト数を取得する事は出来ないのでしょうか? Visual C++ 2008 Express Edhition の デバックモードで動かしています。 ****************************** wchar_t s[256]; s = L"abcあいう"; int len = wcslen(s); ******************************

  • 定義した文字列を wchar_t 系の関数へ

    こんにちは。 VisualStudioでマルチバイト文字セットを使用する設定のプロジェクトで、下記のように定義された文字列を wchar_t をパラメータとする関数にセットするにはどのようにすればよろしいのでしょうか? #define _FOO "foo" void funcA( const char* const szValue ) { } void funcW( const wchar_t* const szValue ) { } void test( void ) { funcA( TEXT( FOO )) ; ← ok。 funcW( TEXT( FOO )) ; ← エラー。 } UNICODE文字セットを使用する設定のプロジェクトならば問題ないのですが、マルチバイト設定ですとエラーになってしまいます。UNICODE、マルチバイト両方にプロジェクトに対応できるにはどうきじゅつすればよろしいのでしょうか。

  • MFC C++ と C++/CLI の文字列

    VS2008です。 Library: NativeC++ with MFC -> DLL   ↑↓ Wrapper: C++/CLI with .NET -> DLL   ↑↓ Appli: VB.NET with .NET -> EXE 元々、ActiveXコントロール(非GUI利用)だったNativeC++で書かれたLibraryを MFC DLLとしてビルドし、Wrapper 経由で Appli から使用できるよう 移植をしています。 Library から必要な関数を dllexport し、wrapper から参照し、 wrapper を Appli が参照して、使用できるようにしました。 int型を引数に取り、結果として返す関数は期待どおり動作しますが、 文字列だと上手く行きません。 Wrapper/Appli は System.CString で統一したいのですが、 Library ではどのような型として宣言すれば文字列のやり取りができるでしょうか。 ( 引数・戻値の両者 ) CString wchar_t* char* System.String ALT::CStringT basic_string _bstr_t CComBSTR LPCTSTR LPTSTR PCTSTR PTSTR LPCWSTR LPWSTR PCWSTR PWSTR BSTR… なお、Library で下記のようにエクスポートし __declspec(dllexport) BSTR test(LPCTSTR data); wrapper で BSTR hoge(LPCTSTR value){ return test(value); } と宣言すると、wrapperのビルドで下記のエラーが表示されます。 エラー 1 error LNK2028: 未解決のトークン (0A000B39) "wchar_t * __cdecl test(wchar_t const *)" (?test@@$$FYAPA_WPB_W@Z) が 関数 "public: wchar_t * __clrcall wrap::hoge(wchar_t const *)" (?hoge@C3dlib@@$$FQ$AAMPA_WPB_W@Z) で参照されました。 wrapper.obj wrapper エラー 2 error LNK2019: 未解決の外部シンボル "wchar_t * __cdecl test(wchar_t const *)" (?test@@$$FYAPA_WPB_W@Z) が 関数 "public: wchar_t * __clrcall wrap::hoge(wchar_t const *)" (?hoge@C3dlib@@$$FQ$AAMPA_WPB_W@Z) で参照されました。 wrapper.obj wrapper エラー 3 fatal error LNK1120: 外部参照 2 が未解決です。

  • 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) 以上、よろしくお願いします。

  • 文字列を特定の全角文字で区切る方法

    文字列を特定の全角文字で区切る方法 C言語で、文字列を特定の全角文字で区切って画面に出力する操作をしたいのですが、うまくいきません。 #include <wchar.h> int main(void) {   wchar_t name[] = L"シーゲンゴ・タロウ";   wchar_t *p;   wchar_t delim[] = L"・";   wprintf(L"%ws\n", name);   p = wcstok(name, delim);   putws(p);   while (p!=NULL) {     p = wcstok(NULL, delim);     if (p!=NULL) {       putws(p);     }   } } 上記のコードを実行すると、出力が シーゲンゴ・タロウ シ [ゲンゴ タロ・ となってしまい、何故か"ー"と"ウ"まで反応して別の文字になります。 今までwchar.hを使ったことが無かったので、やり方が不味い所を教えて下さい。 よろしくお願いします。

  • コピーコンストラクタが呼び出されていない?

    コピーコンストラクタが呼び出されていない? class myclass { public: int x; myclass(const int& init_); //コンストラクタ myclass(const myclass& init_); //コピーコンストラクタ const myclass operator+(const myclass& rhs); //加算 const myclass& operator=(const myclass& rhs); //代入 }; と定義したクラスを使ってオブジェクトを生成するときに妙な挙動をしています。 myclass mc1(10); myclass mc2 = 20; myclass mc3(mc1 + mc2); //コピーコンストラクタが呼ばれるはず このコードを実行した結果は、mc3(mc1+mc2)では自分で定義したコピーコンストラクタは実行されませんでした。 mc3(mc1 = mc2)と実行すれば、コピーコンストラクタが実行されたのですが、この違いはどこにあるのでしょうか。 そもそも、myclassとmyclass&は全く別のものなのでしょうか?

  • デフォルトコンストラクタで分からないことがあります。

    デフォルトコンストラクタ デフォルトコンストラクタで分からないことがあります。 以下のコードです。 > template<class T1, class T2> > struct pair > { > T1 first; // 1つ目の値 > T2 second; // 2つ目の値 > > // デフォルトコンストラクタ > pair() : first( T1() ), second( T2() ){} > > // 引数付きコンストラクタ > pair(const T1& a, const T2& b) : first( a ), second( b ){} > }; このコードの中の pair() : first( T1() ), second( T2() ){} で初期化子による初期化をしていると思うのですが「T1()」と「T2()」は具体的に 何をしているのでしょうか?自分の想像ではfirstとsecondに何か初期化の値を代入して初期化していると思うのですが何でしょうか? なお、その次のコードの意味は分かります。 > pair(const T1& a, const T2& b) : first( a ), second( b ){} これは、引数a,bを持っていてそれぞれfirstにaを代入してsecondにbを代入して初期化しているのですよね。 なお、このコードが掲載されているサイトはここです。 http://www.geocities.jp/ky_webid/cpp/library/011.html

専門家に質問してみよう