VC++6.0文字列処理でエラーが発生する

このQ&Aのポイント
  • VC++6.0を使って文字列処理を行っていますが、エラーが発生しています。
  • エラーメッセージは「error C2057: 定数式が必要です」というもので、文字列処理の部分で発生しています。
  • 不定ポインタの指す先でstrcpyなどの文字列処理関数を使うと実行時エラーになる可能性があるため、対処方法を探しています。
回答を見る
  • ベストアンサー

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++ではこのような場合どうすればいいのかわかりません。 対処方法をご存知の方、よろしくお願いします。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

# 忘れ物 ^^ callocで動的に確保しているので freeで開放してください 2番目の wchar_t *wCharBuf=L""; としてしまうと 文字列を書き込む領域が確保されていないため 他の変数や関数の戻り値などを破壊する可能性があります wchar_t wCharBUf[512];など必要なバッファ量をあらかじめ設定するか calloc/mallocまたは newなどで確保しましょう MultiByteToWideChar(CP_ACP, 0, fullPath, fullPathLength-1, wCharBuf, fullPathLength-1); は MultiByteToWideChar(CP_ACP, 0, fullPath, fullPathLength, wCharBuf, fullPathLength); がいいようです ^^

kamkamkam3
質問者

お礼

どうもご回答ありがとうございます。 C言語は配列数の指定に定数が必要なんですね。その辺の基礎が飛び飛びで抜けているので、細かなコンパイルエラーが出て困ってます(;^^ 私は元々Java暦が長いので・・ また、CStringから直接MultiByteToWideChar関数に値を渡せるんですね。Windowsプログラムも中々知識が浅く、やたらめったらに実践的なものを組んでいる状態なので、検索しては無理やりパズルみたいにはめていってるので、こういうことも教えてもらえてとてもありがたいです。 No.2欄へのご回答により、やりたいことができるようになりました。おかげさまでとても助かりました。Javaができたからできるだろうと、予想して請け負ったはいいけど、えらい目にあっています(;^^ おかげさまで、無事解決できました。No.1とNo.2の回答が両方ともとても参考になりました。AmazonでCの古い本を買って本格的に全部網羅してみようとおもいます。断片的に色々理解してるのでいけるかと思ったんですが、やはりつらいですね。 ご親切にどうもありがとうございました。ちなみに、JavaよりMFCの方が面白いですね。どうもありがとうございました。 とても助かりました。

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

int fullPathLength = fullPath.GetLength() + 1; //*1 char charBuf[fullPathLength]; この記述ではコンパイルできませんね char charBuf[fullPathLength]; と記述すためにはfullPathLengthがコンパイル時点で確定している必要があります つまり #defineでなどで定義された定数や 10、20などの即値が必要です 一度 char配列にコピーしてから MultiByteToWideCharに渡していますがそのまま CStringから渡してやればいいはずですよ wchar_t* wcharBuf = (wchar_t*)calloc( fullPathLength, sizeof( wchar_t ) ); MultiByteToWideChar(CP_ACP, 0, fullPath, fullPathLength-1, wCharBuf, fullPathLength-1); といった具合で可能だと思います

関連するQ&A

  • 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++ 2008 expess editionでDirectshowを使ってライブ配信されている動画を保存するプログラムを作成しています。 その際に HRESULT AddSourceFilter( LPCWSTR lpwstrFileName, LPCWSTR lpwstrFilterName, IBaseFilter **ppFilter ); という関数を使用していて、テキストファイルから読み込んだURLをlpwstrFilenameとしようとしています。 まずテキストファイルを使わずに #define URL L"mms://localhost:1024/" hr=pGraph->AddSourceFilter(URL, L"SourceFilter", &pSrc); とやった場合はうまく動作するのですが、 「mms://localhost:1024/」とだけ記述したURL.txtから読み込もうとした場合、 #define STR_MAX 256 char strs[STR_MAX]; fp = fopen("URL.txt", "r"); if (fp == NULL) { wprintf(L"sample.txt を開けませんでした。\n"); return EXIT_FAILURE; } while (fgets(strs, STR_MAX, fp) != NULL){} fclose(fp); printf("%s\n",strs); std::locale::global(std::locale("japanese")); wchar_t pwsz[sizeof(strs)*2]; MultiByteToWideChar(CP_ACP, 0, strs, strlen(strs), pwsz, sizeof(pwsz)); LPCWSTR Data = pwsz; std::wcout << Data << std::endl; hr=pGraph->AddSourceFilter(Data, L"SourceFilter", &pSrc); というようにやって実行した場合はstrsにもDataにも「mms://localhost:1024」がきちんと入っているようでしたが コンパイルは通ったものの実行してもソースが認識されませんでした これはワイド文字列への変換が間違っているのでしょうか?

  • 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++にて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を使ってファイルオープンできれば良いです。

  • 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++のテキストに書いてあるとおりにやったのですが,なぜできないのか分かりません.プロジェクトをつくるときの設定か,プロパティに問題があるのでしょうか。

  • 文字列の扱いについて教えてください

    #include<cstdio> #include<cstring> #define _CRT_SECURE_NO_DEPRECATE 1 #define MAXBUFF 256 void s_swap(char* str_a, char* str_b) { char str_dummy[MAXBUFF]; strcpy_s(str_dummy,strlen(str_dummy),str_a); ★ strcpy_s(str_a,strlen(str_a),str_b); ★ strcpy_s(str_b,strlen(str_b),str_dummy); } void main(void) { char* str_a = "ABC"; char* str_b = "DEF"; int a; printf("呼出前:str_a=%s, str_b=%s\n", str_a, str_b); s_swap(str_a,str_b); printf("呼出後:str_a=%s, str_b=%s\n", str_a, str_b); } str_aとstr_bの中身を入れ替える処理で、エラーや警告はでないのですが ★のところで実行失敗します。 昔から文字列の処理は苦手でどのように攻略したらよいのか 解説していただけないでしょうか。

  • CStringについて

    よろしくお願い致します。 CString型の文字の最後の1文字を’¥0’に変更するにはどうすれば良いのでしょうか? CStringのことが良く分かっていないので、質問の仕方が変かも知れませんがお教えください。 今は仕方なしに、こんな感じでやってます。 CString m_InputData; char moji[100]; int n; strcpy(moji,m_InputData); n=strlen(moji); moji[n-1]='\0' m_InputData=moji;

  • C++Builder 2009 テキストボックスの文字列取得

    Editは、テキストボックスです。 Editには、"12345"の半角文字列が入っています。 これを、C言語の文字列として取得しようとしました。 このときのソースコードは、次の通り。 -------- char *ptr1 = new char[Edit->Text.Length()+1]; //独自領域にセーブ strcpy(ptr1, Edit->Text.c_str()); //ptr1にアドレスをコピー -------- このstrcpyの行で、エラーが出てしまい、対処に困っています。     ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ E2034 'wchar_t *' 型は 'const char *' 型に変換できない E2342 パラメータ '__src' は const char * 型として定義されているので wchar_t * は渡せない -------- Edit->Textで取得した文字列を、"12345\0"といった具合で処理をしたいのですが、どのようにしたらいいのでしょうか? 追記 「C++Builder 2009」以前のバージョンでは、難なく取得できていた。 同じソースコードなのに、何故かエラーになる。

  • 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 が未解決です。

  • createTextNode実行後の文字化けについて

    こんにちは。現在、XMLファイルをC++で変換し、HTMLファイルを生成するプログラムを作成しています。(2)のソースから(1)の関数を呼んで文字列の変換を行った後、テキスト要素の作成、追加を行っていますが、「全角文字列」という文字列が「蜈ィ隗呈枚蟄怜・」と出力されてしまいます。解決方法についてご教示願います。 (1)BSTR AsciiToBSTR(const char* ascstr)  {   WCHAR wszURL[MAX_PATH];   ::MultiByteToWideChar(CP_ACP, 0, ascstr, -1, wszURL, MAX_PATH);   return SysAllocString(wszURL);  } (2)  IXMLDOMDocument* pHTMLDoc  IXMLDOMNode * pNewNode;  BSTR bstrText;  bstrText = AsciiToBSTR("全角文字列");  pDoc->createTextNode(bstrText, &pNewNode);  pHTMLDoc->appendChild(pNewNode, NULL);