【问题标题】:Out of bounds on the wrong variable with mktime使用 mktime 超出错误变量的范围
【发布时间】:2019-05-04 05:23:38
【问题描述】:

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

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);

【问题讨论】:

  • 你知道月份范围是 0 到 11 对吗?鉴于 12 月是第 12 个月..
  • struct tm date; 中的哪些字段 also 您声明您从未费心设置为 any 确定值?有些被mktime 忽略;有些不是。您是否希望mktime 以某种方式猜测这些值不是您在通话之前设置的?
  • 开始工作前将struct tm的所有元素初始化为0:struct tm date = { 0 };。目前,您正在为结构的时间组件使用不确定的值。您还应该检查 scanf() 调用是否有效 — 返回了正确数量的值(分别为 3 和 1)。您可以测试对mktime() 的调用;您可以在每次调用mktime() 后打印date 值。你确定是编译器在抱怨吗?

标签: c mktime


【解决方案1】:

问题

  • .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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 2016-03-05
    相关资源
    最近更新 更多