2016-09-12 3 views
2

나는 초보자이며 2 일 사이에 며칠을 계산하려고하는데 time.h에 대해 명확하게 이해하지 못하고 누군가 내 실수를 지적 할 수 있습니까? 인쇄 된 후 sec = 0이기 때문입니다. 고맙습니다.키보드에서 입력 한 2 날짜 사이의 일수 계산

#include <stdio.h> 
#include <time.h> 

main(){ 



    double sec; 

    struct tm BD; 
     BD.tm_mday;   
     BD.tm_mon;   
     BD.tm_year; 

    struct tm KT; 
     KT.tm_mday;   
     KT.tm_mon;   
     KT.tm_year; 

    printf("Start date: "); 
    scanf("%d %d %d",&BD.tm_mday,&BD.tm_mon,&BD.tm_year); 

    printf("End date: "); 
    scanf("%d %d %d",&KT.tm_mday,&KT.tm_mon,&KT.tm_year); 

    sec = difftime(mktime(&KT),mktime(&BD)); 

    printf("%f",sec); 

// date= sec/86400 // 

    return 0; 
} 
+5

C 또는 C++을 사용하고 있습니까? 질문은 C++로 태그 지정되었지만 이것은 곧은 C 코드입니다. 만약 당신이 C++로 이것을 배우고 있다면, 나는 C++ 교육을 위해 다른 곳을 볼 것을 제안 할 것이다. – NathanOliver

+1

C++ 11 이상의 컴파일러에 액세스 할 수있는 경우 std :: chrono 네임 스페이스를 확인하십시오. http://en.cppreference.com/w/cpp/chrono – Ceros

+1

@ NathanOliver 죄송합니다. C에게 편집. 내 실수를 보여줄 수 있니? 내 데이트 입력이 좋지 않은 것 같습니다. –

답변

0

코드 mktime()를 호출하기 전에 필요한 필드를 설정하는 데 실패합니다. 결과 : 정의되지 않은 동작입니다.

struct tm BD; 

// these 3 lines of code do nothing 
BD.tm_mday;   
BD.tm_mon;   
BD.tm_year; 

scanf("%d %d %d",&BD.tm_mday,&BD.tm_mon,&BD.tm_year); 
// Only 3 of the 9+ fields of `BD` have a defined value. 

대신 구조를 먼저 0으로 설정하고 tm_isdst을 설정하십시오. mktime()을 올바르게 사용하려면 tm_ydaytm_wday을 제외한 모든 필드를 먼저 설정해야합니다. 이 두 필드는 읽기 위해 무시됩니다. 모든 필드가 기본 범위로 업데이트됩니다.

struct tm은 정의 된 9 개 필드 집합보다 많을 수 있으므로 먼저 모두 필드가 설정되도록 전체 구조체 필드를 0으로 초기화하는 것이 쉽습니다. 코더는 종종 tm_isdst 및 기타 선택적 필드를 설정하는 것을 잊지 만 일관성없는 결과를 초래합니다.

#include <stdio.h> 
#include <time.h> 

int main(void) { 
    struct tm BD = { 0 }; 
    // Set to -1 to direct mktime() to decide if DST applies or not. 
    // or set to 0, or 1, if a specific DST flag is desired. 
    BD.tm_isdst = -1; 
    struct tm KT = { 0 }; 
    KT.tm_isdst = -1; 

    printf("Start date: "); 
    if (3 != scanf("%d %d %d", &BD.tm_mday, &BD.tm_mon, &BD.tm_year)) return -1; 

    printf("End date: "); 
    if (3 != scanf("%d %d %d", &KT.tm_mday, &KT.tm_mon, &KT.tm_year)) return -1; 

    double sec = difftime(mktime(&KT), mktime(&BD)); 

    printf("%f\n", sec); 
    return 0; 
} 
1

이 예를 시도하십시오. 당신은 자정에 시계를 설정해야하고 정수로 결과의 둘레에, 그 계산은 정확 :

#include <stdio.h> 
#include <time.h> 
int main() { 
    struct tm start_date; 
    struct tm end_date; 
    time_t start_time, end_time; 
    double seconds; 
    printf("Start date: "); 
    scanf("%d %d %d",&start_date.tm_mday ,&start_date.tm_mon,&start_date.tm_year); 
    printf("End date: "); 
    scanf("%d %d %d",&end_date.tm_mday,&end_date.tm_mon,&end_date.tm_year); 
    start_date.tm_hour = 0; start_date.tm_min = 0; start_date.tm_sec = 0; 
    end_date.tm_hour = 0; end_date.tm_min = 0; end_date.tm_sec = 0; 
    start_time = mktime(&start_date); 
    end_time = mktime(&end_date); 
    seconds = difftime(end_time, start_time); 
    printf ("%d days difference\n", (int) (0.5 + seconds/(60*60*24))); 
    return 0; 
} 

테스트

Start date: 23 11 2017 
End date: 27 11 2017 
4 days difference