• ベストアンサー

(MFC)コンボボックスの値を数値比較

VC++2005のMFCにてアプリケーションを作成しています。 コンボボックス(Ctrl変数:m_xcStMonth)に入力された値の、 正常値入力チェックとして、「1」から「12」までの数値ならtrue、 それ以外の数値及び文字列ならfalseを返す機能を実装したいのですが、 下記プログラムだと、「2」を入力しても、比較関数(1)(2)の戻り値として、 (1)RetMonth1には正常値「1」を返すのですが、 (2)RetMonth2にも誤り値「1」を返してしまいます。 原因として、「2」と「12」を比較した際に、 それぞれ一文字目の「2」と「1」を比較してしまうので、 誤り値を返してしまうようです。 下記が問題のソースコードです。 案1が比較関数にstrcpy_s()を使用した場合、 案2が比較関数CString::Compare()を使用した場合です。 両方において、RetMonth2に誤った戻り値を返しています。 もし何か良い改善策、より効率の良い実装方法などご存知の方おられましたら、 お手数ですが、ご教授お願い致します。 【案1】 CString StMinMonth; CString StMaxMonth; StMinMonth.Format( "%d", 1 ); StMaxMonth.Format( "%d", 12 ); CString StMonth; m_xcStMonth.GetWindowText( StMonth ); // コンボボックスの値を取得 char CmpMonth [ MAX_WORD_SIZE + 1 ] = ""; char CmpMinMonth[ MAX_WORD_SIZE + 1 ] = ""; char CmpMaxMonth[ MAX_WORD_SIZE + 1 ] = ""; strcpy_s( CmpMonth, MAX_WORD_SIZE + 1, StMonth ); strcpy_s( CmpMinMonth, MAX_WORD_SIZE + 1, StMinMonth ); strcpy_s( CmpMaxMonth, MAX_WORD_SIZE + 1, StMaxMonth ); int RetMonth1 = strcmp( CmpMonth, CmpMinMonth ); //(1) int RetMonth2 = strcmp( CmpMonth, CmpMaxMonth ); //(2) if( ( RetMonth1 < 0 ) || ( RetMonth2 > 0 ) ) { return false; } return true; 【案2】 CString StMinMonth; CString StMaxMonth; StMinMonth.Format( "%d", 1 ); StMaxMonth.Format( "%d", 12 ); CString StMonth; m_xcStMonth.GetWindowText( StMonth ); // コンボボックスの値を取得 int RetMonth1 = StMonth.Compare( StMinMonth ); //(1) int RetMonth2 = StMonth.Compare( StMaxMonth ); //(2) if( ( RetMonth1 < 0 ) || ( RetMonth2 > 0 ) ) { return false; } return true;

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

  • ベストアンサー
回答No.1

単純に数値に変換して比較するのではだめなのでしょうか? CString StMonth; m_xcStMonth.GetWindowText(StMonth); TCHAR* pchEnd; int nMonth = _tcstol(StMonth, &pchEnd, 10); if (*pchEnd != _T('\0')) { // 数値以外の入力がある } else {   if (nMonth < 1 || 12 < nMonth) {   // 月として正しくない   }   else {   // 正常   } }

その他の回答 (3)

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.4

>正常値入力チェックとして、「1」から「12」までの数値ならtrue、 >それ以外の数値及び文字列ならfalseを返す機能を実装したい 関数を実装します static bool IsValidMonth(LPCTSTR Text) { int m; int n = sscanf_s(Text, "%d", &m); if (n <= 0) return false; // Textは数次に変換できない return m >= 1 && m <= 12;  } 上記を呼び出す部分は CString s; m_xcStMonth.GetWindowText(s); if (!IsValidMonth(s)) { // エラー処理 } else { // 正常処理 } で如何でしょうか?

zigen8513
質問者

お礼

沢山の親身なご回答ありがとうございます。 全て実装確認し、こちらの想定する結果に最も近いご回答に、 恐れ入りながら、良回答をつけさせて頂きます。 申し訳ありませんが、こちらにてまとめてのお礼とさせて頂きます。 ありがとうございました。

回答No.3

文字列のまま比較したいなら。 CString StMonth; CString StMinMonth = "01"; CString StMaxMonth = "12"; m_xcStMonth.GetWindowText( StMonth ); // コンボボックスの値を取得 StMonth.Insert(0,"00"); StMonth = StMonth.Right(2); return ((StMinMonth >= StMonth) && (StMaxMonth <= StMonth)); または CString StMonth; CString StMinMonth = "01"; CString StMaxMonth = "12"; m_xcStMonth.GetWindowText( StMonth ); // コンボボックスの値を取得 StMonth.Insert(0,"00"); StMonth = StMonth.Right(2); int RetMonth1 = StMonth.Compare( StMinMonth ); int RetMonth2 = StMonth.Compare( StMaxMonth ); return ((RetMonth1 >= 0) && (RetMonth2 <= 0));

回答No.2

CString StMonth; m_xcStMonth.GetWindowText( StMonth ); // コンボボックスの値を取得 int i = ::_ttoi(StMonth); return ((i >= 1) && (i <=12));

関連するQ&A