• ベストアンサー

VC++ 文字列のDate型チェック

こんばんは。 VC++でVBのIsDateのような使い方をする関数 CString または CHar配列などの文字列がDate型かどうか チェックする関数を探しています。 MFCとかにないのでしょうか? 2006/05/26とかのチェックは一文字づつ抜き出して xxx/xx/xxという形はチェックできるのですが うるう年とか考慮すると自作だとかなり複雑なものになってしまいそう なので・・・ どなたかお分かりになる方、よろしくお願いします。

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

  • ベストアンサー
  • ko_kinta
  • ベストアンサー率39% (43/109)
回答No.1

これが最良かどうかの自信はないのですが…。 以下の手順で一応できます。 1. struct tm構造体を0でmemsetし、日付の文字列からtm_year、tm_mon、tm_mdayに格納します。(この時tm_yearは1900を、tm_monは1を引くことを忘れないでください。) 2. mktime()にその構造体を渡してカレンダー値を取得します。 3. カレンダー値をlocaltime()に渡してstruct tm型の戻り値を取得します。 4. 文字列から生成した構造体と、localtime()で取得した構造体のtm_year、tm_mon、tm_mdayを比較して、全てが同値であれば正しい日付文字列となります。 例えば日付文字列が"2006/2/31"であった場合、localtime()で受け取る値は年が2006、月が3、日が3となるので、正しくない日付であると判断できます。

pokepotto
質問者

お礼

やはりそういった関数はないのですね・・・ 記述していただいた方法でやってみようと思います。 どうもありがとうございました(^^)

その他の回答 (2)

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.3

#2のコーディング #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #define DATE_LEN (10) bool IsDate(const char *szDate) {  // 文字数でチェック  if(strlen(szDate) != DATE_LEN)   return false;  // 文字種でチェック  for(int i = 0; i < DATE_LEN; i++) {   switch(i) {   case 4:   case 7:    if(szDate[i] != '/')     return false;    break;   default:    if(!isdigit(szDate[i]))     return false;   }  }  // 暦でチェック  char szTmp[DATE_LEN+1];  strcpy(szTmp,szDate);  int nYear = atoi(strtok(szTmp,"/"));  int nMonth = atoi(strtok(NULL,"/"));  int nDay = atoi(strtok(NULL,"/"));  if(nMonth < 1 || nMonth > 12 || nYear == 0 || nDay == 0)   return false;  int nUruu = 0;  if(nYear%4 == 0){   if(nYear%100 == 0){    if(nYear%400 == 0){     // 閏年     nUruu = 1;    }   } else {    // 閏年    nUruu = 1;   }  }  int nMaxDay;  switch(nMonth) {  case 2:   nMaxDay = 28+nUruu;   break;  case 4:  case 6:  case 9:  case 11:   nMaxDay = 30;   break;  default:   nMaxDay = 31;  }  if(nDay > nMaxDay)   return false;  return true; }

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.2

複雑……かな? 1,3,5,7,8,10,12月が大の月(31日まで) 4,6,9,11月が小の月(30日まで) 2月が28or29日まで if(year%4 == 0){  if(year%100 == 0){   if(year%400 == 0){    // 閏年   }  } else {   // 閏年  } } 今の暦でのみ考えるのならこれだけっしょ? char szDate[DATE_LEN+1]; char tmp[DATE_LEN+1]; int year,month,day; // szDateに入っている文字列をチェックする strcpy(tmp,szDate); year = atoi(strtok(tmp,"/")); month = atoi(strtok(NULL,"/")); day = atoi(strtok(NULL,"/")); // で、最初に書いた判定をする

pokepotto
質問者

お礼

確かにそれほど複雑でもなかったかもしれません(--;) ただVBだとIsDate一発ですんでしまうので そういう関数があればと思い質問させていただきました。 ソースまで書いて頂き参考になりました。 どうもありがとうございました(^^)

関連するQ&A

  • VC6++ char配列の文字列をシリアライズする方法

    入門書には、char配列の文字列をシリアライズで保存する場合は、CStringにキャストして保存するとあったのですが、保存時は ar << (CString)m_char; で保存されているようなのですが、読み出し時はどうすればいいのでしょうか? ar >> (CString)m_char; では読めませんでした。 VC初心者です。よろしくお願いします。

    • ベストアンサー
    • CGI
  • 文字列の変換

    超 C++ 初心者です。 コンソールで "Hello, world!" を学んでからニ,三ヶ月程度です。 C++ の string クラスのメンバ関数 c_str() を用いることで /**  * string(C++ の文字列)から C の文字列(文字配列)を取り出し  * その先頭のアドレスを返す  */ ということができるのを学びました。 今 C++ の string および VC++ の CString の変換をしたいと思っています。 例えば VC++ で MFC アプリケーションを作っているとき, C++ の string である temp を VC++ の CString として使えるように するには,どういう手段をとればよいのでしょうか。 逆に VC++ の CString である temp を C++ の string として使うとき の方法もご教授ねがえれば幸いです。 超初心者につき,方法があまりにも難しいようでしたら断念することも考えています。

  • VC++2005で、CString型に16進文字列を入れたいのですが・・

    VC++2005で、CString型に16進文字列を入れたいのですが・・・ 次のようなエラーが出ます。 void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)' : 1 番目の引数を 'const char [5]' から 'const wchar_t *' に変換できません。 プログラムは次の通りです。 CString strBuff; CString strWork; TCHAR tszBuff[80]; UINT unLength; UINT un1; unLength = 5; strBuff = "12345"; _tcscpy(tszBuff, strBuff); strWork = ""; for(un1 = 0; un1 < unLength; un1++) { strWork = strWork + strBuff.Format("%02x", tszBuff[un1]); ←ここにエラーがあると言われています。 } 結果は、strWorkに、"3132333435"となるようにしたい! ネットで探したら、 >UNICODEを使われているのだと思われます。 >T("")マクロを使ってワイドキャラクタに変換するように指示すれば動くと思います。 とあったので、 strWork = strWork + strBuff.Format(_T("%02x"), tszBuff[un1]); としてみたのですが、 二項演算子 '+' : 型 'void' の右オペランドを扱う演算子が見つかりません (または変換できません)。 というエラーが表示されました。 VC++6.0を半年かじり、今日、初めてVC++2005に触った程度の初心者です。 どなたか助言を頂ければ幸いです。 環境  Windows XP Pro SP3  Visual C++ 2005(MFC) 以上、よろしくお願いします。

  • VC++2010 MFC エディットボックスの質問

    VC++2010 MFC エディットボックスの質問なんですが、 バリュー型変数を使わないでどうやったら配列(char型8byte(unsigned char[8]))の中身すべてをエディットボックスにいれて表示することができますか?よろしくお願いします。配列の中身は文字もあったりします

  • VCでのDLLからVBへの文字列の引渡し

    ===VB(Ver.6.0 SP5)側=== Public Declare Function GetStrSample Lib "Test.dll" () As String ・・・・・ Label1.Caption = GetStrSample ===VC側(Ver6.0)=== const char *StrSample="ABCDE01234";   ・・・・ _declspec(dllexport) BSTR _stdcall GetStrSample() { CString strResult; strResult = StrSample; return strResult.AllocSysString(); } 上記のようなコードで、VC側をDLLとしてVBから呼び出すと、 Label1には "A" しか表示されず、ブレークを置いてGetStrSample の戻り値を調べてみると、0x41,0x00,0x42,0x00,のように、 0x00が挟まれてしまいました。 ( ?hex(asc(mid(GetStrSample,3,1))) のようにして調べました。)  何故なのでしょうか? 文字コードの違いでしょうか? 正常にABCDE01234が渡せるようにするにはどうすればいいでしょうか? VCは初心者で、本や他人の作ったコードやMSDNを見て作成してみました。 目的は、DLLのバージョン等の情報をVB側に渡したいのです。 よろしくお願いします。

  • 文字列の中をチェックしたいのですが・・・

    文字列の入った配列の中をチェックし重複する文字列がある場合 その文字列を消去し文字列に対応した個数をカウントしていくものを VB6.0で作っているのですがどうしても上手くいきません。 どうか教えてくださいおねがいします。

  • C++(VC6)で、CString型を配列へ

    C++(VC6)で、CString型の文字列をCString型の配列へセットする方法を教えてもらえませんか? キーワード検索で、AND検索・OR検索を実現する為に、まずはCString型の文字列をCString型の配列にセットしたいです。 例えば、 □阪神□□□野球□赤松□□ と入力されたCString型の文字列を、 keyword[0] = 阪神 keyword[1] = 野球 keyword[2] = 赤松 と、セットしたいのです。 ※文字列中の"□"は全角空白、または半角空白を表しています。 よろしくお願い致します。

  • VC++6.0にて、文字列処理にて困っています。

    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++ではこのような場合どうすればいいのかわかりません。 対処方法をご存知の方、よろしくお願いします。

  • 文字列の受け渡し

    先ほど質問したものですが、お願いします。 関数で戻り値として、文字列を扱う場合、 char* sendstr(void){ char* mychar="HELLO!!\n"; return mychar; } ならうまくいきますが、 char* sendstr(void){ char mychar[]="HELLO!!\n"; return mychar; } だと、うまくいきません。 配列の場合、mycharで、ポインタと なると、思うのですが。 後者の方が、分かりやすそうですが、 だめなのでしょうか。 (char*は文字型のポインタで、文字列 へのポインタになるのでしょうか)。

  • 【VC++6.0(MFC)】CString型の変数から数字部分を取り出すには?

    いつも大変お世話になっています。 VC初心者です。 現在、VC++6.0(MFC)でコーディングしております。 早速ですが、有識者の方がいらっしゃいましたら ご教授頂きたくお願いします。 ===質問=== CString型変数に以下のような数値を含む文字列から 数値部分だけを取り出すにはどうやってソースを 組めば宜しいでしょうか? ===例01=== CString cs1 = "2009年7月29日"; この文字列から "2009","7","29"を取得したい ===例02=== CString cs2 = "AM10:00:00 -0.4℃"; この文字列から "10","0","0","-0.4"を取得したい 以上、よろしくお願いします。

専門家に質問してみよう