我正在try 一个图书借阅系统,它可以告诉用户他们必须归还图书的日期.因为我必须用这些数据来判断借款时间是否超过了限额.我try 使用两个tm struct .

struct tm *Olddate;
struct tm *Newdate;

我在一个这样的 struct 上加了几天

Newdate->tm_mday += 7;

当我试着打印出两个不同的 struct 时,输出在某种程度上是相同的.

printf("Current local time and date: %s", asctime(Olddate));
printf("Current new time and date: %s", asctime(Newdate));

输出:

Current local time and date: Tue May 17 21:37:16 2022
New time and date: Tue May 17 21:37:16 2022

最小可重复性示例:

#include <stdio.h>
#include <time.h>
int main () {
    time_t rawtime;

    struct tm *Olddate;
    struct tm *Newdate;

    time( &rawtime );

    Olddate = localtime(&rawtime);
    Newdate = localtime(&rawtime);
    
    Newdate->tm_mday += 7;

    printf("Current local time and date: %s", asctime(Olddate));
    printf("New time and date: %s", asctime(Newdate));
    return 0;
}

推荐答案

localtime函数返回一个指向静态数据的指针,以便在后续调用中覆盖该数据的内容.

您应该改为使用接受struct tm地址的localtime_r来填充.

time_t rawtime;

struct tm Olddate;
struct tm Newdate;

time( &rawtime );

localtime_r(&rawtime, &Olddate);
localtime_r(&rawtime, &Newdate);

Newdate.tm_mday += 7;

printf("Current local time and date: %s", asctime(&Olddate));
printf("New time and date: %s", asctime(&Newdate));

如果你用的是MSVC,用localtime_s代替.

localtime_s(&Olddate, &rawtime);
localtime_s(&Newdate, &rawtime);

C++相关问答推荐

标准的C17标准是用括号将参数包装在函数声明中吗

如何在C中通过套接字自定义数据类型读取原始变量?

在编译时参数化类型定义

实现简单字典时C语言中的段错误

函数的限制限定指针参数允许优化调用方函数吗?

如何计算打印二叉搜索树时每行所需的空间?

无法在OpenGL上绘制三角形

tick.q中的Kdb+键控表语法

#定义SSL_CONNECTION_NO_CONST

为什么Fread()函数会读取内容,然后光标会跳到随机位置?

处理EPOLL_WAIT中的接收数据和连接关闭信号

在函数外部使用内联ASM时无法指定操作数

如何将C中的两个字符串与从文件接收的字符串中的字符数进行比较

用C++构建和使用DLL的困惑

在运行时判断C/C++指针是否指向只读内存(在Linux操作系统中)

向左移位3如何得到以字节为单位的位数?

即使我在C++中空闲,也肯定会丢失内存

将size_t分配给off_t会产生符号转换错误

指向返回 struct 成员的指针,安全吗?

快速准确计算double的小数指数