用ctime保存新的时间点会覆盖旧字符串吗?

时间:2017-08-09 00:26:51

标签: c++ c arrays pointers ctime

前言:我去年夏天一直在学习C,最近才开始学习C ++,所以我还不太了解它。

我一直在尝试编写一个C / C ++程序,该程序识别窗口中的鼠标左键和左键单击,并保存单击哪个按钮以及何时进入指向字符串char **clicks的指针数组。我把它组织成一个序列,如:按钮,时间,按钮,时间......

每当检测到鼠标点击时,它都需要" R"或" L"这样做:

void writeClick(char *button) {
    static char **tracker = clicks;
    *tracker = button;
    tracker++;
    time_t seconds = time(NULL);
    *tracker = ctime(&seconds);
    tracker++;
}

我的问题:你可能已经注意到的问题是每个带有时间的数组元素都将指向同一个字符串。结果是每次鼠标点击时间都会更新,但它只会记住上次保存的时间。我想我可以用strcpy解决问题,但如果我想保存多个字符串,那么我不需要为每个字符串添加一个新变量?或者每次都有新的记忆位置?我该怎么做?

我尝试使用strcpy,如此:

strcpy(*tracker, ctime(&seconds));

但是在第二次点击时我的程序崩溃了,我不知道为什么。

其他可能有用的信息:

我计划将数据发送到VBA,因为我想将其转换为Excel电子表格。

我还没有编写我的代码部分,它会在数据充满时动态增加数组,但目前它足够大(50个元素)包含数据只需点击几下崩溃,所以我知道这可能不是问题。

我的代码中检测鼠标点击的部分使用了Windows功能,除此之外,我不认为我的代码会受到我使用的操作系统的影响。我没有点击检测的任何问题(因为我已经解决了所有问题)。

一位朋友告诉我,她只会使用C ++字符串和向量来完成这项工作,但我还不知道。我会查看它们,但如果可能的话,我希望找到一个解决方案。

1 个答案:

答案 0 :(得分:2)

From cppreference.com's page on ctime

  

返回值

     

指向包含日期和时间的文本表示的静态以空字符结尾的字符串的指针。该字符串可以在std :: asctime和std :: ctime之间共享,并且可以在每次调用任何这些函数时被覆盖。

是的,下一次调用ctimeasctime可能会覆盖前一次调用所使用的缓冲区。

strcpy(*tracker, ctime(&seconds));

很可能失败了,因为没有为*tracker分配存储空间来保存字符串。

你可以

*tracker = strdup(ctime(&seconds));

分配和复制,但这会让您忘记跟踪tracker必须手动free的哪些元素。这将非常令人难以置信的快速。如果您希望使用C执行此操作,您将需要strdupfree所有内容,添加一个簿记结构来告诉您是否动态分配存储,因此必须{{1或者进行广泛的重新设计。

由于您已标记C ++,请按照朋友的建议操作,并使用freestd::vector

Documentation on strdup.

Documentation on std::vector.

Documentation on std::string.