在C ++中将0复制为000?

时间:2013-05-06 10:43:06

标签: c string printf

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


我希望这是一个单行的答案。我有一个snprintf()语句,如下所示:

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

我希望buffer能够暂停000,但出于某种原因,它只保留00。假设缓冲区足够大,可以容纳我想要的东西。我傻了吗?

编辑:

有关上下文的完整代码,请参见下文。我之前试图简化它,因为我不认为所有这些背景都是必要的。该问题仍然存在,使用%04u在第一个CSV行中为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; }

{{1}}

3 个答案:

答案 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)

你是16台机器吗?也许您将缓冲区声明为char *,因此sizeof(缓冲区)的计算结果为2,snprintf仅复制实际输出“000”的前两个字节(加上终结符字符0x00)

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

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

比你发布的更重要