![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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++ではこのような場合どうすればいいのかわかりません。
対処方法をご存知の方、よろしくお願いします。
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);
がいいようです ^^
どうもご回答ありがとうございます。
C言語は配列数の指定に定数が必要なんですね。その辺の基礎が飛び飛びで抜けているので、細かなコンパイルエラーが出て困ってます(;^^
私は元々Java暦が長いので・・
また、CStringから直接MultiByteToWideChar関数に値を渡せるんですね。Windowsプログラムも中々知識が浅く、やたらめったらに実践的なものを組んでいる状態なので、検索しては無理やりパズルみたいにはめていってるので、こういうことも教えてもらえてとてもありがたいです。
No.2欄へのご回答により、やりたいことができるようになりました。おかげさまでとても助かりました。Javaができたからできるだろうと、予想して請け負ったはいいけど、えらい目にあっています(;^^
おかげさまで、無事解決できました。No.1とNo.2の回答が両方ともとても参考になりました。AmazonでCの古い本を買って本格的に全部網羅してみようとおもいます。断片的に色々理解してるのでいけるかと思ったんですが、やはりつらいですね。
ご親切にどうもありがとうございました。ちなみに、JavaよりMFCの方が面白いですね。どうもありがとうございました。
とても助かりました。
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel VBA ファイル取得について フォルダの中に、ファイル名“会議“を含むファイルが1つまた 9 2022/10/12 01:18
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Excel(エクセル) Indirect関数について、Formulatextで抽出した数式を参照したい。 1 2022/12/15 11:16
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# C言語:数値の桁数指定についての質問です。 8 2022/05/26 23:53
- Visual Basic(VBA) Activesheet.Pasteで困っています 1 2023/01/22 07:41
- Visual Basic(VBA) 指定列最終行までのスペースを改行するVBAについて 2 2022/06/01 19:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語でポインタ変数を用いた配...
-
C言語のintとcharの違いってな...
-
C言語にて構造体のメンバがNULL...
-
ポインタを使って回文かどうか...
-
文字列内の数字削除
-
char*を初期化したいのですが
-
CStringからchar*への型変換に...
-
【C言語】引数にファイルパスを...
-
fstream型オブジェクトを関数の...
-
csvファイルをfscanfで読み込む...
-
DWORDとcharの変換
-
Cの関数の引数のconst *charに...
-
char 文字列型 の表現範囲が-12...
-
C言語で文字列をかえす正しい書...
-
C言語のプログラムについてです
-
char型にint型の数値を代入する。
-
VBAのプログラムで、DIAG = 1# ...
-
C言語 配列の長さの上限
-
関数から配列を返すには?
-
構造体のextern方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
CStringからchar*への型変換に...
-
C言語のintとcharの違いってな...
-
C言語にて構造体のメンバがNULL...
-
小数点入りの文字列をfloat型に...
-
strcat関数を自作したいです
-
C言語のプログラムについてです
-
const char* s1とただのchar s1...
-
DWORDとcharの変換
-
char型にint型の数値を代入する。
-
文字列の途中から途中までを抽出
-
new charとnew char[N]の違いは?
-
文字列内の数字削除
-
csvファイルをfscanfで読み込む...
-
fgetc( )の戻り値はなぜ整数??
-
char 文字列型 の表現範囲が-12...
-
fstream型オブジェクトを関数の...
-
エクセルのMID関数は、C言語では?
-
ポインタを使って回文かどうか...
-
ポインタ配列
おすすめ情報