我的应用程序中有这段代码:
void dateToString(char * epoch, struct tm * data) {
int year, month, day, hour, minute, second;
year = data->tm_year + 1900;
month = data->tm_mon + 1;
day = data->tm_mday;
hour = data->tm_hour;
minute = data->tm_min;
second = data->tm_sec;
sprintf(epoch, "%04d-%02d-%02dT%02d:%02d:%02d.0Z", year, month, day, hour, minute, second);
}
...
(in main function)
...
currentDate = gmtime(¤tTime);
dateToString(epoch, currentDate);
sprintf(timeIntMs, "%05u", tiMs);
measFile << epoch << "," << measBuffer; measFile.flush();
其中:
ofstream measFile;
unsigned int tiMs;
struct tm * currentDate; // to storage current time [dd-mm-yyyy h:m:s]
char measBuffer[256];
time_t currentTime;
char epoch[23];
char timeIntMs[5];
问题是在这种情况下,在我的measFile
输出文件中,epoch的值为空(即长度为0的字符串),而如果我改变了这样的调用顺序:
currentDate = gmtime(¤tTime);
dateToString(epoch, currentDate);
measFile << epoch << "," << measBuffer; measFile.flush();
sprintf(timeIntMs, "%05u", tiMs);
即。通过在保存文件后移动sprintf
调用,变量纪元保持其自己的值(例如2015-11-08T11:06:05.0Z
)。
此代码中有什么问题?
答案 0 :(得分:4)
您正在使用timeIntMs
写出界限。
而是char timeIntMs[6];
然后sprintf(timeIntMs, "%05u", tiMs % 100000);
。阅读 null终止;并且5
中的%05u
是最小字段宽度,而不是最大值。
最好使用snprintf
,因为即使你在算术中犯了错误,也不会导致缓冲区溢出。