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

标签 c mktime

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

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/

相关文章:

c - 使用 rand() 函数进行随机数的矩阵乘法

php - mktime 在 6 月/7 月产生错误的奇怪行为

C:在 1970 年之前添加与操作系统无关的日期

PHP Mktime 错误

php - 将 mysql 时间戳转换为 mktime

c - 从 YYYYMMDDHHMMSS 字符串获取 time_t 的最快方法

c - RHEL 7.1 中持久 TCP 连接的高可用性/故障转移

c - 尝试递归地计算循环双向链表中的节点时出错

c - 如何从 LBP 图像中获取 256 个 bins/pixels?

c - 使用函数将节点添加到链表