VS2013のswscanf_s()が正常に動作しない場合の訂正方法

このQ&Aのポイント
  • VS2013のswscanf_s()を使用して文字列をパースする際に問題が発生しました。
  • 提供されたコードでは、swscanf_s()関数が正しく機能せず、正しい結果を取得できません。
  • 正しい結果を得るためには、提供されたコードの修正が必要です。
回答を見る
  • ベストアンサー

VS2013のswscanf_s()について

毎度、お世話になります。 下記の、swscanf_s()が旨く働きません、訂正方法をお教えください。 //=========================== WCHAR cc[100], c1[20], c2[20], c3[20], c4[20]; CString ss; ss.Format(_T("a b c d")); wcscpy_s(cc, ss); swscanf_s(cc, _T("%s %s %s %s"), c1, sizeof(c1), c2, sizeof(c2), c3, sizeof(c3), c4, sizeof(c4)); 以上、宜しくお願いします。

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

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

#include <iostream> #include <wchar.h> int main() { wchar_t c1[20], c2[20], c3[20], c4[20]; swscanf_s(L"a b c d", L"%s %s %s %s", c1, sizeof(c1), c2, sizeof(c2), c3, sizeof(c3), c4, sizeof(c4)); std::wcout << L'|' << c1 << L'|' << c2 << L'|' << c3 << L'|' << c4 << L'|' << std::endl; } 結果: |a|b|c|d| ...何の問題もありません。 なにが/どのように「旨く働きません」か?

bakabon_X
質問者

お礼

episteme さん 毎度、お世話になります。 その後、『WCHAR c1[20], c2[20], c3[20], c4[20];』をグロ-バル変数に して、トライしました所旨く行きました。 アドバイス頂きまして有難うございます。

bakabon_X
質問者

補足

episteme さん 毎度、お世話になります。 動作環境の記述が無くて御免なさい。 動作環境: Windows7、Visual Studio Community VS2013のMFC 不具合現象: Button3をクリックしまして、下記のコードの、swscanf_s(L"a b c d", ....)を 実行すると、『Run-Time Check Failure #2 - Stack around the variable 'c1' was corrupted.』なる警告表示のDialogがでます。 そして、c1、c2,c3,c4にはデーターが入っていません。 ============================ void CT_App1View::OnBnClickedButton3(){ wchar_t c1[20], c2[20], c3[20], c4[20]; swscanf_s(L"a b c d", L"%s %s %s %s", c1, sizeof(c1), c2, sizeof(c2), c3, sizeof(c3), c4, sizeof(c4)); } ======================== これは、『VS2013のMFC』に関する問題と思いますが、Button3のコードは、 他のコードとは独立していると思います。 尚、wcscopy、fprintf_s、wcscomp等は、問題ありません。 注)『int main()』でのテストは、これからやってみる予定です。 以上

関連する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

  • VC++6.0にて、文字列処理にて困っています。

    VC++6.0をつかっているんですが、文字列処理の部分で困っています。 CString strTime, folderPlace="c:\\", fullPath; CTime theTime = CTime::GetCurrentTime(); strTime = theTime.Format("%Y%m%d%H%M%S"); fullPath = folderPlace + strTime + ".jpg"; int fullPathLength = fullPath.GetLength() + 1; //*1 char charBuf[fullPathLength]; strcpy(charBuf, fullPath); wchar_t wCharBuf[fullPathLength * 2]; MultiByteToWideChar(CP_ACP, 0, charBuf, strlen(charBuf), wCharBuf, sizeof(wCharBuf)); とすると、【error C2057: 定数式が必要です】というエラーが*1の部分ででます。 また、 CString strTime, folderPlace="c:\\", fullPath; CTime theTime = CTime::GetCurrentTime(); strTime = theTime.Format("%Y%m%d%H%M%S"); fullPath = folderPlace + strTime + ".jpg"; char *charBuf=""; strcpy(charBuf, fullPath); wchar_t *wCharBuf=L""; MultiByteToWideChar(CP_ACP, 0, charBuf, strlen(charBuf), wCharBuf, sizeof(wCharBuf)); とすると、実行時に【 STRCAT.ASMの場所を指定してください】というエラーがでて、これ自体は検索して解決したんですが、どうしても実行時に落ちてしまいます。調べたところ、不定ポインタの指す先でstrcpyなどの文字列処理関数を使うと実行時エラーになるとのことなので、それが原因と思います。 私は、JavaやC#くらいしかあまり経験がないので、C/C++ではこのような場合どうすればいいのかわかりません。 対処方法をご存知の方、よろしくお願いします。

  • Unicodeのファイル読み込みがうまくいきません。。

    下のようなコードで読もうとしているんですが、どうしても文字化けしてしまいます。原因が何なのかさっぱりわかりません。。 分かる方どうかお願いします!開発環境はVC++.NETです。 FILE* fin; wchar_t c; CString ss; if( (fin = fopen( "temp.txt", "r" )) == NULL ){ AfxMessageBox("temp.txtファイルオープンエラー"); exit(1); } fgetws( &c, 2, fin ); ss += c; AfxMessageBox(ss);

  • VC++MFCのC2039errorの対処法

    vc++のプログラムでedit controlにおいて,ボタンを押したらエディットボックスに書き込んだ値を読み込むプログラムを書きました. void CSerialcommunicationDlg::OnBnClickedwritebutton() { CString ss; m_writeEdit.GetWindowTextW(ss);//writeedit値を読み込み CString m_writeEdit } そうしたところ,以下のようなエラーが出てきてしまいました. 1>c:\users\documents\visual studio 2008\projects\ex1\ex1\ex1dlg.cpp(190) : error C2039: 'GetWindowTextW' : 'ATL::CStringT<BaseType,StringTraits>' のメンバではありません。 1> with 1> [ 1> BaseType=wchar_t, 1> StringTraits=StrTraitMFC_DLL<wchar_t> 1> ] このエラーへの対処方法となぜこのエラーが発生しているのかを教えていただきたいです. このコードはvc++のテキストに書いてあるとおりにやったのですが,なぜできないのか分かりません.プロジェクトをつくるときの設定か,プロパティに問題があるのでしょうか。

  • VisualC++6.0にて、mbstowcs_s関数はつかえないのでしょうか?

    現在、VisualC++6.0をやっていますが、CString型変数をwchar_t型に変換しようと思い、自分で調べたところ、mbstowcs_s関数を使う方法がヒットしました。 しかし、コンパイルしてみると【'mbstowcs_s' : 定義されていない識別子です。】というエラーがでます。 view.cppとview.hの差し支えない場所に #include <stdlib.h>の一文も入れてあります。 まさか、そんなことは無いと思うのですが、もう10年位前のソフトですし、mbstowcs_s関数が使えないということはあるのでしょうか・・ ご存知の方、ございましたら、おしえてください。よろしくお願いします。

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

  • mallocしたメモリの開放

    かなり基本的なことですいませんが、 下記のようなイメージのコードで確保したメモリを 確実に開放するにはどうしたらいいでしょうか? やりたいこととしては、動的に確保したメモリにデータを 入れて、それをベクトルに入れて使いまわしたいです。 下記のコードからfreeの部分をやめても大丈夫でしょうか?その場合、どうやってメモリ開放するんでしょうか? ベクトルが消滅すればメモリが開放されるんでしょうか? テストしてみましたが、減った気配がない。。。 根本的に考え方がおかしいかもしれません。。。 お助けください。 お願いします。 wchar_t str[6] = L"あいうえお"; wchar_t* mem = (wchar_t*)malloc(6 * sizeof(wchar_t)); wcsncpy(mem, str, 6); std::vector<wchar_t*> vetorTemp; //実際グローバル変数 vetorTemp.insert(vetorTemp.end(), mem); free(mem); // ここで開放するとvetorTempの中身も利用できなくなってしまった

  • 万年カレンダーのプログラム(C言語)が分からなくて困っています。

    万年カレンダーのプログラム(C言語)が分からなくて困っています。 一応作ってみたけどダメだったので何処がおかしいか指摘してくれると幸いです あとC言語についてはかなり初心者ですすみません #include <stdio.h> int main(void) { int d[13]={ 31 ,28 ,31 ,30 ,31 ,30 ,31 ,31 ,30 ,31 ,30 ,31 }; char youbi[7][4]={"日","月","火","水","木","金","土"}; int y ,m ,n ,a ,b ,c ,cc ,s ,ss ,e; printf("西暦 月 日を入力"); scanf("%d ""%d ""%d ",y,m,n); for(a = 1900 ; a < y ; a++){ if(a % 4 == 0){ if(a % 400 == 0){ s = s+2; } else{ s = s+1; } } if(a % 100 == 0){ s = s+1; } else{ s = s+2; } } if(y % 4 == 0){ if(y % 400 == 0){ ss = ss+2; } else{ ss = ss+1; } } if(y % 100 == 0){ ss = ss+1; } else{ ss = ss+2; } if(ss == 2){ d[1] = 29; } else{ d[1] = 28; } for(b = 0 ; b < m+2 ; b++){ e = d[m] + e; m = m+1; } e = e+n; c = e%7; s = c+s; cc = s%7; printf("%c",youbi[cc]); return 0; }

  • CString Format にて全角空白文字連続して格納する方法は?

    CString のメンバ関数Formatにて全角空白文字を連続して 入れる方法がありましたら教えてください。 GetBufferでアドレスを取得してmemset等で複数格納する事は 可能なのですが、できればFormatをしようしてスマートに 格納したいです。。。 ちなみに半角空白は下記で格納可能でした。 CString s; s.Format("%-36d", " "); 左詰めで半角空白が36バイト入ります。 この要領で全角空白を複数格納したいです。 引数の指定の方法等わかりましたら、教えてください。 よろしくおねがいします。

  • MFCにて乱数

    CString time; p=rand()%20*1000+1; time.Format(_T("%d"),p/1000); にて変数pに乱数を代入し、画面出力します。 CString strp; strp.Format(_T("%d"), p/1000); にてpを型変換して、画面出力するのですが、双方のpの値が一致しません。 どうなってるのでしょうか?

専門家に質問してみよう