CString – プログラミング – Home

通知
すべてクリア

[解決済] CString


薫
 薫
(@薫)
ゲスト
結合: 21年前
投稿: 19
Topic starter  

環境: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型が動作しないのでしょうか?


引用未解決
トピックタグ
カラー
 カラー
(@カラー)
ゲスト
結合: 16年前
投稿: 1
 

>このようにした場合、Findが'.'を見つけてくれません。
>なぜか、シングルクォーテーションをダブルに変えて
>pos = date.Find(.)にすると、'.'を見つけてくれるのですが

C言語の基礎は勉強されたのですか

. '.' 終端があるのとないのとの違いです
終端がなかったらどこまでだかわからいではありませんか

これぐらいコードを書くんだったら変数の宣言もちゃんと書けばいかが?

一歩一歩しらべていけば解決できます
たとえば dateにはちゃんと たとえば2008.10.22がはいているんですか

 


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

単純に
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も呼ばないと。


返信引用
Eriko
 Eriko
(@Eriko)
ゲスト
結合: 16年前
投稿: 7
 

>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だと思います おためしになってください
あとホームページを参考にして勉強されるのも良いのですが、
言語の入門書とかも用意された方が良いと思います
その方が時間も労力も助かります


返信引用
薫
 薫
(@薫)
ゲスト
結合: 21年前
投稿: 19
Topic starter  

カラーさん、Blueさん、Erikoさん
ありがとうございました。

CWnd::GetWindowText(CString&)
を使えば、無事に解決できました。

皆様のご指摘のおかげで上記のソースが
酷いプログラムだったことがわかりました。
皆様のご意見を反映させたおかげで
問題の解決だけではなく、ずいぶんと
わかりやすいソースへと変わりました。

GetBufferの件など、今回の良くないと指摘された点が
他の関数でも、使われていたので
その点も修正することができました。

>あとホームページを参考にして勉強されるのも良いのですが、
>言語の入門書とかも用意された方が良いと思います
アドバイスありがとうございます。
言語について、もっとしっかり勉強していきます。


返信引用
薫
 薫
(@薫)
ゲスト
結合: 21年前
投稿: 19
Topic starter  

済のチェックつけるの忘れてました・・・!
申し訳ないです。


返信引用
Россия
 Россия
(@Россия)
ゲスト
結合: 16年前
投稿: 1
 

Хы =)


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました