我正在尝试计算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;
}
答案 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;
我总能得到正确的答案。