这个问题是答案。与格式化程序无关,而是在复制到新缓冲区时我的白痴。
我希望这是一个单行的答案。我有一个snprintf()
语句,如下所示:
snprintf(buffer, sizeof(buffer), "%03d", 0U);
我希望buffer
能够暂停000
,但出于某种原因,它只保留00
。假设缓冲区足够大,可以容纳我想要的东西。我傻了吗?
编辑:
有关上下文的完整代码,请参见下文。我之前试图简化它,因为我不认为所有这些背景都是必要的。该问题仍然存在,使用%04u
在第一个CSV行中为000
提供了%03u
。 00
只给了我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;
}
。
{{1}}
答案 0 :(得分:2)
如何检查它只包含“000”?如果您从(m_csv_data_buffer + (reading * CSV_ROW_BUFFER_SIZE))
开始阅读,那么您实际上已丢失了第一个字节,因为您已将其复制到代码中的(m_csv_data_buffer + (reading * CSV_ROW_BUFFER_SIZE) - 1U)
。
答案 1 :(得分:1)
strncpy
隐式处理空终止符,所以我猜测你从目标缓冲区地址中减去1,你实际上是把新行的第一个字符放到上一行的最后一个字节中。 / p>
您似乎正在使用固定缓冲区大小和可变字符串长度的组合。这就是你所看到的可能原因。
答案 2 :(得分:0)
我怀疑问题存在于如何您回读缓冲区的内容,而不是实际内容,可能是:
Some dummy code to keep buffer in scope while I check it..
比你发布的更重要