-1

这个问题得到了回答。与格式化程序无关,而是在复制到新缓冲区时我的白痴。


我希望这是一个单行的答案。我有一个snprintf()类似于以下内容的声明:

snprintf(buffer, sizeof(buffer), "%03d", 0U);

我期待buffer持有000,但由于某种原因它只持有00。假设缓冲区足够大,可以容纳我想要的。我是不是很傻?

编辑:

请参阅下面的完整代码与上下文。我之前试图简化它,因为我认为所有这些上下文都是不必要的。重点仍然存在,使用在第一个 CSV 行中%04u给了我。只给我。000%03u00

uint16_t CSVGenerator::write_csv_data(TestRecord* record)
{
    // Define the templates.
    const char *row_template = "%04u,%6.3E,%6.3E,%6.3E,%6.3E,%6.3E\n";
    char csv_row_buffer[CSV_ROW_BUFFER_SIZE];

    // Add the data.
    uint16_t row_count = 0U;
   for (uint16_t reading = 0U; reading < MEASURE_READING_COUNT; ++reading)
   {
       // Parse the row.
       snprintf(csv_row_buffer, sizeof(csv_row_buffer), row_template,
               // Test ID
               MEASURE_PERIOD_SECS * reading,
               // Impedances Z1-Z5.
               record->measurements[reading][0U],
               record->measurements[reading][1U],
               record->measurements[reading][2U],
               record->measurements[reading][3U],
               record->measurements[reading][4U]);

       // Add it to the main buffer, excluding the terminator.
       strncpy((m_csv_data_buffer + (reading * CSV_ROW_BUFFER_SIZE) - 1U),
               csv_row_buffer, (sizeof(csv_row_buffer) - 1U));

       // Increment the row count.
       ++row_count;
   } // for : each reading.

   return row_count;
}
4

3 回答 3

2

你如何检查它是否只包含“000”?如果您正在从中读取它,(m_csv_data_buffer + (reading * CSV_ROW_BUFFER_SIZE))那么您实际上会丢失第一个字节,因为您已将其复制到(m_csv_data_buffer + (reading * CSV_ROW_BUFFER_SIZE) - 1U)代码中。

于 2013-05-06T11:15:08.593 回答
1

strncpy隐式处理空终止符,所以我猜你从目标缓冲区地址中减去 1,你实际上是将新行的第一个字符放入前一行的最后一个字节。

您似乎正在使用固定缓冲区大小和可变字符串长度的组合。这就是您所看到的可能原因。

于 2013-05-06T11:16:13.297 回答
0

你在16位机器上吗?也许您将缓冲区声明为 char* 所以 sizeof(buffer) 评估为 2 并且 snprintf 仅复制实际输出“000”的前两个字节(加上终止符 0x00)

我怀疑问题在于您如何读回缓冲区的内容,而不是实际内容,也许是:

Some dummy code to keep buffer in scope while I check it..

比你发布的更重要

于 2013-05-06T10:48:43.593 回答