负时间转换给出随机值

时间:2016-04-23 08:42:21

标签: c time initialization undefined-behavior integer-overflow

我正在尝试计算C中两个时间点之间的差异,因为这些点在1900之前,我需要使用负值。

虽然转换应该将变量jahr_tod_negative写入ts.tm_year,但几乎每次我运行程序时,它都会给我一个完全不同的日期,即使日期和月份也会混淆。这一年是唯一需要消极的价值。我该如何防止这种情况?

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

int main ()
{

    time_t t;
    struct tm ts;
    char str[90];

    int tag_tod;
    int monat_tod;
    int jahr_tod;
    unsigned int jahr_tod_von_1900;
    int jahr_tod_negative;


    printf("Tag eingeben: ");
    scanf("%d", &tag_tod);
    printf("\nMonat eingeben: ");
    scanf("%d", &monat_tod);
    printf("\nJahr eingeben: ");
    scanf("%d", &jahr_tod);
    jahr_tod_von_1900 = 1900 - jahr_tod;
    jahr_tod_negative = -jahr_tod_von_1900;
    printf("jahr_tod_negative: %d\n", jahr_tod_negative);


    //ts.tm_sec     = 0;
    //ts.tm_min     = 0;
    //ts.tm_hour  = 0;
    ts.tm_mday  = tag_tod;
    ts.tm_mon   = monat_tod;
    ts.tm_year  = jahr_tod_negative;     /* Jahr - 1900 */
    //ts.tm_wday  = 0;
    //ts.tm_yday  = 0;
    //ts.tm_isdst = 0;

    t = mktime(&ts);
    //printf("%s", asctime(&ts));
    printf("ts.tm_year: %d\n", ts.tm_year);
    strftime(str, 90, "%d. %B %Y", &ts);
    printf("Eingegebenes Datum: %s\n", str);

    return 0;
}

2 个答案:

答案 0 :(得分:4)

对于初学者:你想正确初始化

struct tm ts;

使用之前。此外,代码很可能会遇到未定义的行为,因此任何事情都可能发生。

待办事项

struct tm ts = {0};

至少。

此外假设

unsigned int jahr_tod_von_1900;
int jahr_tod_negative;

这句话

 jahr_tod_von_1900 = 1900 - jahr_tod;

导致signed的{​​{1}}整数回绕。后者&#34;溢出&#34;导致未定义的行为然后。 执行此操作。

当您分配给jahr_tod > 1900时,为了解决此问题,请确保您执行了#34; unsigned&#34;减法就像这样:

unsigned

答案 1 :(得分:0)

问题(可能还有其他事情)在于

jahr_tod_von_1900 = 1900 - jahr_tod;

你声明的地方:

unsigned int jahr_tod_von_1900;

如果jahr_tod实际上大于1900会怎样?您隐式地将负值转换为无符号整数,因此通常会得到一个非常大的值。

如果我扔掉所有jahr_tod_negative的东西,只需使用(一次!)

ts.tm_year = jahr_tod - 1900;

我总能得到正确的答案。