char *getSystemTime() {
char y[20], mon[5], d[5], h[5], mins[5], *temp;
char str[5]=".avi"; // 危險:str 太小,strcat 會溢出
// ... itoa/strcat 拼接 ...
return temp; // 返回棧上數組指針,函數返回即失效 → 未定義行為
}
const char* getSystemTime() {
static char buf[64]; // 靜態存儲區,生命周期至程序結束
SYSTEMTIME st;
GetSystemTime(&st); // Windows API,跨平台用 time()/localtime()
snprintf(buf, sizeof(buf), "%04d%02d%02d_%02d%02d%02d.avi",
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
return buf;
}
// 調用
CvVideoWriter* writer = cvCreateVideoWriter(getSystemTime(),
CV_FOURCC('M','J','P','G'), fps, cvSize(w,h), 1);
void getSystemTime(char* outBuf, size_t bufSize) {
SYSTEMTIME st; GetSystemTime(&st);
snprintf(outBuf, bufSize, "%04d%02d%02d_%02d%02d%02d.avi",
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
}
// 調用
char filename[64];
getSystemTime(filename, sizeof(filename));
writer = cvCreateVideoWriter(filename, ...);
#include
#include
#include
std::string makeTimestampFilename() {
auto now = std::chrono::system_clock::now();
auto t = std::chrono::system_clock::to_time_t(now);
std::tm tm = *std::localtime(&t);
char buf[64];
std::strftime(buf, sizeof(buf), "%Y%m%d_%H%M%S.avi", &tm);
return std::string(buf);
}
// 用 cv::VideoWriter (C++ API, 推薦)
cv::VideoWriter writer(makeTimestampFilename(),
cv::VideoWriter::fourcc('M','J','P','G'), fps, cv::Size(w,h), true);
**告別棧指針返回、緩衝區溢出、非標準函數,用 `snprintf` + 靜態/傳出緩衝區,或直接拥抱 C++17 `