いつもお世話になっております。
先日のつづきになってしまいますが、
Editコントロールから、GetDlgItemText()でchar x[5]に整数の文字列を取得した後にatoi()でその値を数値に変えたいのですが、
GetDlgItemText(hDlg,IDC_EDIT4,x,(int)sizeof(x)-1);
kaisi[0]=atoi(x);
このとき、xに入っていた文字列が"200"ならばatoi()の戻り値は2を返してくる様なのですが、このような症状の原因が思い当たるかたいませんか?
もしくはこのような原因がのっているサイトはないでしょうか?
よろしくおねがいします。
とりあえず、開発環境は明記しましょう。
(OS,VC(またはVS)のバージョン等)
>GetDlgItemText(hDlg,IDC_EDIT4,x,(int)sizeof(x)-1);
GetDlgItemText関数の第3引数は終端文字を含めた文字数ですので、-1しなくてもいいです。
[MSDN]
http://msdn2.microsoft.com/en-us/library/ms645489.aspx
より
>nMaxCount
>[in] Specifies the maximum length, in TCHARs, of the string to be copied to the buffer pointed to by lpString.
>If the length of the string, including the NULL character, exceeds the limit, the string is truncated.
※日本語訳ではNULLcharacterについて触れていないようだったので英語にした。
# GetWindowTextとかでは明に書いてあるんですけど。
(GetDlgItemTextはTCHAR用の関数なので、正しくは
TCHAR x[5];
GetDlgItemText(hDlg, IDC_EDIT4, x, sizeof(x) / sizeof(x[0]));
kaisi[0] = _ttoi(x);
とすべき。)
もとからint型の値をとるのであれば
GetDlgItemInt
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpwinui/html/_win32_getdlgitemtext.asp
でよいのでは?
>このような症状の原因が思い当たるかたいませんか?
予想としては、
Visual C++2005(Visual Studio2005)でデフォルトのコンパイルオプションのままビルド
+
C言語としてビルドもしくは提示されたコードではない(実は第二引数をキャストしている)
ものをビルドしている
のであれば、UnicodeのL'2'を 0x0032 を char型配列 0x32, 0x00 としてしまうため、
2になってしまうということでしょう。
訂正
>UnicodeのL'2'を 0x0032 を
UnicodeのL'2'の 0x0032 を
ちなみに L"200" は char型配列だと、8バイト必要になり、
0x32 0x00 0x30 0x00 0x30 0x00 0x00 0x00
というコード列になります。
Blueさん
どうもです!!
Visual C++2005(Visual Studio2005)でデフォルトのコンパイルオプションのままビルド
+
C言語としてビルド
言われるとまさに図星なのですが、c言語としてのビルドはまずいのでしょうか?
最初のひと文字目が0x32 0x00となり0x00でatoi()が終了してしまうという事ですよね?
原因がわかったので解決できそうです。
ありがとうございました!!
>c言語としてのビルドはまずいのでしょうか?
別にまずくはないですが、今回のように型が違うのにコンパイルできる
というようなことがあるので、ちゃんと知識をつけていないと原因を
つかめないってことはあるでしょうね。
とりあえず、何を参考にしてプログラムを組んでいるかわかりませんが、
TCHARではなくcharを使うのであればコンパイルオプションを変えておくほうがよさそうです。
プロジェクトのプロパティの
「構成プロパティ」−「全般」−「文字セット」
を
「Unicode文字セットを使用する」
から
「マルチバイト文字セットを使用する」
に変更する。
そういう事ですか。
わかりやすく、とても勉強になりました!
ご指摘されたとうり変更してみます。
ありがとうございました!!