0

2 つの日付の日数を返す datediff in days 関数を作成しました (入力形式は 20100810 です)。

プログラムを実行した後、入力文字列が壊れてしまい、どこが間違っているのか理解できません。

これを AIX で実行していますが、これを Redhat で実行すると文字列が破損しません。

以下はコードです

#include <iostream>
#include <ctime> 
#include <sstream>
using namespace std;

int GetYear(std::string dateStr)
{
std::string year = dateStr.substr (0,4);
int sYr = atoi(year.c_str());
//std::cout <<"<<<GetYear dateStr:"<< dateStr << " yearStr:"<< year <<", int sYr:" << sYr << std::endl;
return sYr;
}


int GetMonth(std::string dateStr)
{
 //std::cout <<">>>GetMonth dateStr:"<< dateStr << std::endl;
 int sMn =0;
 std::string mm = dateStr.substr (4,2);
 sMn = atoi(mm.c_str());
// std::cout <<"<<<GetMonth dateStr:"<< dateStr <<"MonthStr:"<< mm <<", int MM:" << sMn << std::endl;
 return sMn;
}

int GetDay(std::string dateStr)
{
 //std::cout << ">>>GetDay dateStr:"<< dateStr << std::endl;
 int sDy = 0;
 std::string dd = dateStr.substr (6,2);
 sDy = atoi(dd.c_str());
 //std::cout << "<<<GetDay dateStr:"<< dateStr<<" DayStr:"<< dd <<", int DD:" << sDy << std::endl;
 return sDy;
}


int dateDiff_Days (std::string startStr,std::string endStr){
std::cout << ">>>dateDiff_Days" << std::endl; 
int sYr;
 int eYr;
 int sMn;
 int eMn;
 int sDy;
 int eDy;
 time_t end;
 time_t start;
 struct tm *startDate;
 struct tm *endDate;
 int dif;
 int i =0;
//Move over the start date to string and convert string to int
 sYr = GetYear(startStr);
 sMn = GetMonth(startStr);
 sDy = GetDay(startStr);
//Move over the end date to string and convert string to int
 eYr = GetYear(endStr);      
 eMn = GetMonth(endStr);
 eDy = GetDay(endStr);
//Move information into startDate structure
start = time(0);
  startDate = localtime (&start); 
  startDate->tm_year = (sYr-1900);  //Years since 1900
  startDate->tm_mday = sDy;          //Day of the month: 1-31
  startDate->tm_mon = sMn-1;           //Months since Jan: 0-11
//Leave default zero's in for the rest
  startDate->tm_sec = '0';           
  startDate->tm_min = '0';
  startDate->tm_hour = '0';
  startDate->tm_wday = '0';
  startDate->tm_yday = '0';
  startDate->tm_isdst = '0';
  start = mktime (startDate);

//Move info into endDate structure, same as startDate.
end = time(0);
  endDate = localtime (&end);
  endDate->tm_year = (eYr-1900);
  endDate->tm_mday = eDy;
  endDate->tm_mon = eMn-1;
  endDate->tm_sec = '0';
  endDate->tm_min = '0';
  endDate->tm_hour = '0';
  endDate->tm_wday = '0';
  endDate->tm_yday = '0';
  endDate->tm_isdst = '0';
  end = mktime (endDate);

  dif = difftime (end, start);
  dif = dif/86400;
 return dif;

}   
int main (){

std::string dt1 = "20100810";
std::string dt2 = "20100810";

        std::cout << ">>>GetLaterDate before dt1="<< dt1 <<" dt2="<< dt2 << std::endl;   
        std::string tempDt1 (dt1);
        std::string tempDt2 (dt2);
        int i = dateDiff_Days(dt1,dt2);
        std::cout << ">>>GetLaterDate before dt1="<< dt1 <<" dt2="<< dt2 << std::endl; 
        std::cout << ">>>GetLaterDate before tempDt1="<< tempDt1 <<"   tempDt2="<< tempDt2 << std::endl; 
return 0;
}

出力:

>>>GetLaterDate before dt1=20100810 dt2=20100810
>>>dateDiff_Days
>>>GetLaterDate 前に dt1=NULLNULL dt2=NULLNULL
>>>tempDt1=NULLNULL tempDt2=NULLNULL の前に GetLaterDate
4

3 に答える 3

6

次のように、構造体を初期化するほとんどすべての行tmが間違っています。

startDate->tm_sec = '0';

これは実際には に設定startDate->tm_secされ48ます。フィールドは文字ではなく整数です。

于 2012-09-13T12:32:17.123 に答える
1

補足として、実際に呼び出す必要はなくtime、とにかく上書きするときlocaltimeに a へのポインターを取得するだけです。struct tmこれを行う必要があります:

struct tm ttm;

memset(&ttm, 0, sizeof(ttm));
ttm.tm_year = sYr - 1900;
ttm.tm_mon = sMn - 1;
ttm.tm_mday = sDy;
time_t start = mktime( &ttm );

memset(&ttm, 0, sizeof(ttm));    // Because mktime can alter the struct
ttm.tm_year = eYr - 1900;
ttm.tm_mon = eMn - 1;
ttm.tm_mday = eDy;
time_t end = mktime( &ttm );

localtime偽の何かを返すためにヒープを破損している可能性があるかどうかはわかりません。多分。とにかく、私がここで示したことを試してみてください。問題が解決しない場合でも、少なくともより良い方法です。

于 2012-09-13T22:50:52.820 に答える