• ベストアンサー

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

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

  • ベストアンサー
回答No.1

CStringクラスが使えるならCStringAクラスを介してchar型配列に入れてみては。 CString csPass(_T("Testテスト")); char cName[512]; strcpy_s(cName, CStringA(csPass)); UnicodeにあってCP932(Shift_JIS)にない文字はおかしくなりますけど。 (wchar_t→char変換ということである以上回避しようがない。)

janjap
質問者

お礼

回答ありがとうございました。 確認したところ上手くいきました。頂いた注意点に気を付けながら使用したいと思います。 今回は本当にありがとうございました。

その他の回答 (1)

  • Lchan0211
  • ベストアンサー率64% (239/371)
回答No.2

MicrosoftのATLやMFCで提供されているCStringクラスには GetString()というメソッドはなかったと思いますが、 独自作成のCStringクラスですか? csPass.GetString()の結果をデバッガ等で 確認してみる必要があるように思います。 Microsoft標準のCStringクラスであれば、 wcstombs_s(&sz, cName, sizeof(cName), (LPCTSTR)csPass, _TRUNCATE); でよさそうに思います。 (参考) http://msdn.microsoft.com/ja-jp/library/awkwbzyc.aspx

janjap
質問者

お礼

回答ありがとうございます。 CStringクラスは独自作成のものではありませんが、私自身CStringクラスについてまだまた勉強不足のようです。 教えていただいた参考ページもとても勉強になりました。 今回は回答いただき本当にありがとうございました。

関連するQ&A

  • 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

  • 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()は使用できないのでしょうか

  • ソケット

    VC++2005 Windous7 で作業しています。 シフトジス + ソケット で作ったメールソフトを、ユニコード版にしようとしているのですが、 Winsock の扱いは、下の例のように、コード変換をしながら扱ってゆくしかないのでしょうか? wchar_t を直接受け取ってくれる関数は無いのでしょうか? void MyClass::socksend(const wchar_t* wbuffer) { // determine the required buffer size size_t buffer_size; wcstombs_s(&buffer_size, NULL, 0, wbuffer, _TRUNCATE); // do the actual conversion char *buffer = (char*) malloc(buffer_size); wcstombs_s(&buffer_size, buffer, buffer_size, wbuffer, _TRUNCATE); // send the data size_t buffer_sent = 0; while (buffer_sent < buffer_size) { int sent_size = send(this->m_socket, buffer+buffer_sent, buffer_size-buffer_sent, 0); buffer_sent += sent_size; } // cleanup free(buffer); } よろしくお願いします。

  • 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++/CLIのFormでの開発なのですが、function(char *str)に起動時の引数を渡したいと考えたのですが、array<System::String ^>をchar型に変える方法が分からず、苦戦しております。 どうやったら良いのでしょうか? エラーは次のように出ます。 CouponPrint.cpp(22): error C2664: 'PtrToStringChars' : 1 番目の引数を 'cli::array<Type> ^' から '__const_String_handle' に変換できません。(新しい機能 ; ヘルプを参照) with [ Type=System::String ^ ] この変換を実行可能なユーザー定義変換演算子がないか、または演算子を呼び出せません。 以下、そのときのソースコード int main(array<System::String ^> ^args) { // コントロールが作成される前に、Windows XP ビジュアル効果を有効にします Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); if(!args) { size_t convertedChars = 0; size_t sizeInBytes = ((args->Length + 1) * 2); const wchar_t *wch = PtrToStringChars(args); char *ch = (char *)malloc(sizeInBytes); errno_t err = 0; err = wcstombs_s(&convertedChars, ch, sizeInBytes, wch, sizeInBytes); if (err != 0) printf_s("wcstombs_s failed! \n"); function(ch); free(ch); } // メイン ウィンドウを作成して、実行します Application::Run(gcnew Form1()); return 0; }

  • CStringを含むconst構造体

    VC++6.0で typedef struct { int i; CString s; } StructTest; という構造体を作ったとして const StructTest m_STest = { 1, "TEST" }; とすると 『error C2552: 'm_STest' : 初期化子リストによる個別の識別子の初期化に誤りがあります。』 と出ます。 このような記述は出来ないのでしょうか?

  • error C2440: 'static_cast' : 'CString' から 'LPCSTR' に変換できません

    CStringから LPCSTR型への変換orその逆について教えて下さい。 Visal Studio 2005のC++で以下のサンプルを動かしました。 http://www.g-ishihara.com/mfc_nw_01.htm すると、以下のプログラムを実行させると、IとIIでエラーが発生しました。 I  byteCP = static_cast<LPCSTR>(sendStr) +sendSum; error C2440: 'static_cast' : 'CString' から 'LPCSTR' に変換できません。 II  byteP = recvStr.GetBuffer(21); error C2440: '=' : 'wchar_t *' から 'LPSTR' に変換できません。 学習のため、サンプルに従って進めていきましたが、 そこでつまずいてしまいました。 CStringについては、全く知識がありません。 ご存じの方、教えて下さい。 void CClientSockDlg::OnBnClickedBtnSend() { CSocket sock; unsigned int port = 0; CString sendStr, recvStr; int send, recv, sendSum, recvSum; LPCSTR byteCP = NULL; LPSTR byteP = NULL; int err = 0; UpdateData(); // (1)ソケット作成 if (!err) if (!sock.Create()) err = 1; // (2)ポート取得 if (!err) if (_stscanf_s(m_xvEditPort, _T("%d"), &port) != 1) err = 1; // (3)接続 if (!err) if (!sock.Connect(m_xvEditIP, port)) err = 1; // (4)送信(20バイト固定) if (!err) { sendStr = m_xvEditMes; while (sendStr.GetLength() < 20) sendStr += _T(" "); sendStr = sendStr.Left(20); sendSum = 0; while (sendSum < 20) { byteCP = static_cast<LPCSTR>(sendStr) +sendSum; //------- I send = sock.Send(byteCP, 20 -sendSum); if (send == SOCKET_ERROR) {err = 1; break;} sendSum += send; } } if (!err) { m_xvEditLog += _T("Send : "); m_xvEditLog += sendStr +_T("\r\n"); } // (5)受信(20バイト固定) if (!err) { byteP = recvStr.GetBuffer(21);  //------- II recvSum = 0; while (recvSum < 20) { recv = sock.Receive(byteP +recvSum, 20 -recvSum); if (recv == SOCKET_ERROR || recv == 0) {err = 1; break;} recvSum += recv; } byteP[20] = '\0'; recvStr.ReleaseBuffer(); } if (!err) { m_xvEditLog += _T("Recv : "); m_xvEditLog += recvStr +_T("\r\n"); } // (6)エラー表示 if (err) { LPVOID lpMsgBuf = NULL; ::FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, sock.GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL); m_xvEditLog += _T("Error : "); m_xvEditLog += static_cast<LPTSTR>(lpMsgBuf); UpdateData(FALSE); LocalFree(lpMsgBuf); } // (7)切断 sock.Close(); UpdateData(FALSE); return; }

  • スレッド内のCString使用

    VC++を始めて約3ヶ月で、現在、シリアル通信プログラムを作成しています。 通信用のウインドウを生成し、その時に受信用のスレッドを生成しているのですが、その受信スレッド内でCString変数を使う(何か挿入)と、終了時に「Detected memory leaks!」が発生します。 起動中の動作は今のところ問題ないようですが、終了時といえど、エラーが発生するという事は、何かまずい処理としていると思われますので質問させて頂きました。 これは、と思われる方は助言をお願いします。 環境  Visual C++6.0  Windows XP Pro SP3 Create時 m_hRxThread = ::AfxBeginThread(RxThreadFunc, (LPVOID)this); スレッドの宣言 static UINT RxThreadFunc(LPVOID p); 受信スレッド UINT CRsNetWnd::RxThreadFunc(LPVOID p) { CString strRecvData; char szRxDat[1024]; char szRecvData[1024];   ・        ・   ・        ・ pWnd->m_bRxThreadEndFlag = FALSE; PurgeComm(pWnd->m_hComm, PURGE_RXCLEAR); while(pWnd->m_bRxThreadEndFlag == FALSE) { --- 省略 --- if((szRxDat[0] == 0x02) && (bReadError == FALSE)) { ZeroMemory(szRecvData, sizeof(szRecvData)); CopyMemory(szRecvData, &szRxDat[1], (dwWrite - 2)); // STX、ETX以外を抜き出す strRecvData = szRecvData; // ここをコメントにすると、エラーは発生しない! --- 省略 --- } } PurgeComm(pWnd->m_hComm, PURGE_RXCLEAR); TRACE0( "受信スレッド終了\n" ); ::AfxEndThread(0); return 0; } 以上、よろしくお願いします。

  • スレッドの作成について(pthread_create関数)

    以下のプログラムをLinuxで実行するとpthread_create関数の戻り値が『1』となり、errno変数には『4』が入ってしまいます。(どちらにも『0』が入っててほしい) 何がやりたいのかというと、子スレッドのプライオリティを優先指定にして、子スレッドが生成されることを確認したいだけなのですが。。。 (下のプログラムじゃきっと本質的には確認できたことにはならないとおもいますが。。。) 何故pthread_create関数の戻り値が『1』となり、errno変数には『4』が入ってしまうかわかる方、どなたかご教授願えませんでしょうか? -------------------------------ここから------------------------------- #include <pthread.h> #include <errno.h> void *test2( void * ); int main ( int argc, char **argv ) { int iThCreateRes=0; pthread_attr_t t_attr; int bRet=0; pthread_t szThreadHandle; errno = 0; pthread_attr_init( &t_attr ); pthread_attr_setdetachstate( &t_attr, PTHREAD_CREATE_JOINABLE ); pthread_attr_setschedpolicy( &t_attr,SCHED_RR ); pthread_attr_setinheritsched( &t_attr, PTHREAD_EXPLICIT_SCHED ); pthread_attr_setscope( &t_attr, PTHREAD_SCOPE_PROCESS ); iThCreateRes = pthread_create( &szThreadHandle, &t_attr, test2, (void *)777 ); if( iThCreateRes == 0 ) { } return ( bRet ); } void *test2( void *iParam ) { return (void*)0; } -------------------------------ここまで-------------------------------

  • プロンプト入力 malloc( )

    #include <iostream.h> void f(char* str); main(){ char s[8] = "\0"; cout << "文字を入力" << '\n'; fgets(s, 8, stdin); f(s); } void f(char* str){ char* c; c = (char*)malloc(sizeof(char) * strlen(str)+1); cout << strlen(str) << '\n'; cout << sizeof(c); free(c); } - 結果 - 文字を入力 ( a、Ctrl+Z ) a 1 4 でした。 cout << sizeof(c); の結果は4でした。1バイトの入力だから\0を含めて 2バイトを確保したかった。 そのためにはどうしたらいいんですか? どうして4だったんですか? 文字を入力するとこで、Ctrl+Z の代わりに Enter を押すと Enter まで s に格納されてしまう。 cin を使うと8バイト以上の入力でも s に格納されてしまう。 そうならないためのよい方法があったら教えてください。

専門家に質問してみよう