【问题标题】:"Sprintf" deletes the value assigned to a variable not invoked in the call“Sprintf”删除分配给未在调用中调用的变量的值
【发布时间】:2015-11-09 09:49:17
【问题描述】:

我的应用程序中有这段代码:

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(&currentTime);
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(&currentTime);
dateToString(epoch, currentDate);
measFile << epoch << "," << measBuffer; measFile.flush();
sprintf(timeIntMs, "%05u", tiMs);

即通过在保存文件后移动 sprintf 调用,变量 epoch 保持其自己的值(例如 2015-11-08T11:06:05.0Z)。

这段代码有什么问题?

【问题讨论】:

    标签: c++ string file file-io printf


    【解决方案1】:

    您正在使用timeIntMs 写入超出范围。

    而不是 char timeIntMs[6]; 然后 sprintf(timeIntMs, "%05u", tiMs % 100000); 。了解空终止;而%05u 中的5最小 字段宽度,而不是最大宽度。

    最好改用snprintf,这样就算算错了也不会造成缓冲区溢出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 2016-06-01
      • 1970-01-01
      相关资源
      最近更新 更多