gpt4 book ai didi

c - mktime 在错误的变量上越界

转载 作者:太空宇宙 更新时间:2023-11-04 02:24:06 25 4
gpt4 key购买 nike

我正在尝试将用户输入日期添加到现有时间结构中,但我收到了一个我不明白的错误。当我试图修改月份日期时,编译器告诉我工作日超出范围。代码贴在下面。

struct tm date;
int m, d, y, n;
char buffer[80];
printf("Enter a date in mm/dd/yyyy format.\n");
scanf("%d/%d/%d", &m, &d, &y);

date.tm_mday = d;
date.tm_mon = m;
date.tm_year = y - 1900;
mktime(&date);

printf("How many days would you like to advance this time?");
scanf("%d", &n);
date.tm_mday += n;
mktime(&date);
strftime(buffer, sizeof(buffer), "%c", &date);
printf("Your new date is %c", buffer);

最佳答案

问题

  • .tm_mon 预计 1 月 0-11 日以来的月份。

    这通常意味着从用户输入中减去 1。 @dashboard

    // date.tm_mon = m;
    date.tm_mon = m - 1;

  • mktime(&date); 读取除 .tm_yday.tm_wday 之外的所有成员,而 OP 仅设置其中的 3 个。最好使用 {0} 初始化所有成员,因为我们只知道另外 7 个成员,而且可能更多。 @Jonathan Leffler

  • 代码没有检查 mktime() 的返回值是否有错误。

  • 使用 "%s" 打印一个字符串。这意味着 OP 没有完全启用警告的良好编译器。使用好的编译器可以节省时间并启用所有警告。

    char buffer[80];
    printf("Your new date is %c", buffer); // Bad specifier

把这些放在一起。

// struct tm date;
struct tm date = {0}; // Initialize all
int m, d, y, n;
char buffer[80];

printf("Enter a date in mm/dd/yyyy format.\n");
if (scanf("%d/%d/%d", &m, &d, &y) != 3) {
Handle_error();
}


date.tm_mday = d;
// date.tm_mon = m;
date.tm_mon = m - 1;
date.tm_year = y - 1900;
date.tm_isdst = -1; // Set dst flag to: let mktime figure it out
if (mktime(&date) == -1) {
Handle_error();
}

printf("How many days would you like to advance this time?");
scanf("%d", &n);
date.tm_mday += n;
if (mktime(&date) == -1) {
Handle_error();
}

strftime(buffer, sizeof(buffer), "%c", &date);
printf("Your new date is %s", buffer);

关于c - mktime 在错误的变量上越界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53584904/

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