2016-09-12 11 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申し訳ありませんが、私の間違いを教えてくれますか?私の日付の入力が悪いようです。 –

答えて

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. 

代わりに構造体を最初にゼロに設定し、tm_isdstを設定します。 mktime()を正しく使用するには、tm_ydaytm_wdayを除いて、すべてのフィールドを最初に設定する必要があります。これらの2つのフィールドは読み込みのために無視されます。すべてのフィールドがプライマリ範囲に更新されます。 struct tmとして

9つのフィールドの定義されたセット以上を有していてもよく、全てフィールドが設定されている保証するために最初にゼロに構造全体のフィールドを初期化することが容易です。コーダーは、しばしば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 
関連する問題