gpt4 book ai didi

c - 负时间转换给出随机值

转载 作者:太空狗 更新时间:2023-10-29 15:32:01 24 4
gpt4 key购买 nike

我正在尝试计算 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;
}

最佳答案

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

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 整数环绕 jahr_tod > 1900。后者的“溢出”也会导致未定义的行为不要这样做。

无论如何,当您分配给 unsigned 时,要解决此问题,请确保您以这种方式执行“unsigned”减法:

jahr_tod_von_1900 = 1900U - (unsigned int) jahr_tod;

关于c - 负时间转换给出随机值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36808583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com