環境:VC6.0 MFC XP
こんにちは。薫と申します。
早速質問させていただきます。
エディットボックスに入力した日付を、
年、月、日、それぞれへ分割する作業がしたいです。
日付は、2008.10.22のように
入力されるので、ドットを判別して格納しようとしています。
pTxt = ( CEdit* )GetDlgItem(IDC_DATE);
pTxt->GetWindowText(eTxt.GetBuffer(0),DATE_MAX + 1);
date = eTxt;
while(pos != -1){
pos = date.Find('.');
front = date.Left(pos);
date = date.Mid(pos+1);
if(pos == -1){ //ドットが見つかったらループを抜ける
break;
}
count++;
if(count == 1){
year = (atoi(front)); //ドットより前をYearにセットする。
}else if(count == 2){
month = (atoi(front)); //ドットより前をMonthにセットする。
day = (atoi(date)); //ドットより後をdayにセットする。
}
}
このようにした場合、Findが'.'を見つけてくれません。
なぜか、シングルクォーテーションをダブルに変えて
pos = date.Find(.)にすると、'.'を見つけてくれるのですが
次の、LeftやMidが働いてくれません。
pTxt = ( CEdit* )GetDlgItem(IDC_DATE);
pTxt->GetWindowText(eTxt.GetBuffer(0),DATE_MAX + 1);
date = eTxt;
の部分を
CString date = 2008.10.22と指定すると、
上手くプログラムは動いてくれ、
年、月、日へと分割することができます。
GetWindowText()で文字列を取得した値と
CStringで取得した値では何か違いがあるのでしょうか?
GetWindowText()で文字列をとってきた場合、
CString型が動作しないのでしょうか?
>このようにした場合、Findが'.'を見つけてくれません。
>なぜか、シングルクォーテーションをダブルに変えて
>pos = date.Find(.)にすると、'.'を見つけてくれるのですが
C言語の基礎は勉強されたのですか
. '.' 終端があるのとないのとの違いです
終端がなかったらどこまでだかわからいではありませんか
これぐらいコードを書くんだったら変数の宣言もちゃんと書けばいかが?
一歩一歩しらべていけば解決できます
たとえば dateにはちゃんと たとえば2008.10.22がはいているんですか
単純に
CWnd::GetWindowText(LPTSTR, int)
ではなく、CString用の
CWnd::GetWindowText(CString&)
のほうを使えばよいのでは?
http://msdn.microsoft.com/ja-jp/library/db50wx7h.aspx
また
>pTxt->GetWindowText(eTxt.GetBuffer(0),DATE_MAX + 1);
DATA_MAX + 1となっているのであるならばGetBufferの引数が0なのはまずいのでは?
それと、ReleaseBufferも呼ばないと。
>pTxt = ( CEdit* )GetDlgItem(IDC_DATE);
pTxtに関する宣言がないので
CEdit* pTxt = ( CEdit* )GetDlgItem(IDC_DATE);
と仮定してみます
>pTxt->GetWindowText(eTxt.GetBuffer(0),DATE_MAX + 1);
CString date;を宣言して
pTxt->GetWindowText(date);
でOK
>while(pos != -1){での囲い
項目が三つしかないのでwhile使わないで次のようになさった方がよいのでは?
CString year=",month=",day=",disp;
int pos,tosi,tuki,niti;
pos = date.Find(.);
if(pos>=0){year=date.Left(pos); date=date.Mid(pos+1);}
pos = date.Find(.);
if(pos>=0){month=date.Left(pos); day=date.Mid(pos+1);}
tosi = atoi(LPCTSTR(year));
tuki = atoi(LPCTSTR(month));
niti = atoi(LPCTSTR(day));
disp.Format(%d年%d月%d日,tosi,tuki,niti);
AfxMessageBox(disp);
でもOKだと思います おためしになってください
あとホームページを参考にして勉強されるのも良いのですが、
言語の入門書とかも用意された方が良いと思います
その方が時間も労力も助かります
カラーさん、Blueさん、Erikoさん
ありがとうございました。
CWnd::GetWindowText(CString&)
を使えば、無事に解決できました。
皆様のご指摘のおかげで上記のソースが
酷いプログラムだったことがわかりました。
皆様のご意見を反映させたおかげで
問題の解決だけではなく、ずいぶんと
わかりやすいソースへと変わりました。
GetBufferの件など、今回の良くないと指摘された点が
他の関数でも、使われていたので
その点も修正することができました。
>あとホームページを参考にして勉強されるのも良いのですが、
>言語の入門書とかも用意された方が良いと思います
アドバイスありがとうございます。
言語について、もっとしっかり勉強していきます。
済のチェックつけるの忘れてました・・・!
申し訳ないです。
Хы =)