将0复制为C+中的000+;?

将0复制为C+中的000+;?,c,string,printf,C,String,Printf,这个问题得到了回答。与格式化程序无关,而是我在复制到新缓冲区时的愚蠢行为 我希望这是一个简单的答案。我有一个snprintf()语句,如下所示: snprintf(buffer, sizeof(buffer), "%03d", 0U); 我希望buffer能够容纳000,但出于某种原因,它只能容纳00。假设缓冲区足够大,足以容纳我想要的东西。我是不是很傻 编辑: 有关完整的上下文代码,请参见下文。我以前试图简化它,因为我认为所有这些上下文都是不必要的。点仍然存在,使用%04u在第一行中为我提

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


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

snprintf(buffer, sizeof(buffer), "%03d", 0U);
我希望
buffer
能够容纳
000
,但出于某种原因,它只能容纳
00
。假设缓冲区足够大,足以容纳我想要的东西。我是不是很傻

编辑:

有关完整的上下文代码,请参见下文。我以前试图简化它,因为我认为所有这些上下文都是不必要的。点仍然存在,使用
%04u
在第一行中为我提供
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;
}
uint16\u t CSVGenerator::写入csv\u数据(TestRecord*record)
{
//定义模板。
const char*row_template=“%04u、%6.3E、%6.3E、%6.3E、%6.3E、%6.3E\n”;
字符csv_行_缓冲区[csv_行_缓冲区_大小];
//添加数据。
uint16行计数=0U;
用于(uint16\u t读数=0U;读数<测量读数\u计数;++读数)
{
//解析该行。
snprintf(csv\行\缓冲区)、sizeof(csv\行\缓冲区)、行\模板、,
//测试ID
测量周期秒*读数,
//阻抗Z1-Z5。
记录->测量值[读数][0U],
记录->测量值[读数][1U],
记录->测量值[读数][2U],
记录->测量值[读数][3U],
记录->测量[读数][4U]);
//将其添加到主缓冲区,不包括终止符。
strncpy((m_csv_data_buffer+(reading*csv_ROW_buffer_SIZE)-1U),
csv_行_缓冲区(sizeof(csv_行_缓冲区)-1U);
//增加行数。
++行数;
}//对于:每次读取。
返回行计数;
}

您在16位机器上吗?可能您将buffer声明为char*所以sizeof(buffer)的计算结果为2,而snprintf只复制实际输出“000”(加上终止符0x00)的前两个字节

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

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

是否比您发布的内容更重要?如何检查它是否只包含“000”?如果您是从
(m_csv_data_buffer+(reading*csv_ROW_buffer_SIZE))
读取它,那么实际上您丢失了第一个字节,因为您已经将它复制到
(m_csv_data_buffer+(reading*csv_ROW_buffer_SIZE)-1U)
在您的代码中。

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


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

缓冲区有多大,它是什么,它是如何定义的?缓冲区是否定义为
char*buffer=malloc(blah)
;有可能吗?另外,如果您的号码没有签名,您应该在同一个函数中使用
%03u
(不是d)@EdKing:还是作为参数传递?(也就是说,请不要让我们猜测您的代码实际上是什么,请发布一个简短、完整的代码片段来重现您的问题)当
缓冲区
定义正确时,您的代码工作正常:但Mat提出了一个非常好的问题;它在函数中不起作用。请发布一个完整的、可编译的示例来演示这个问题。对我们看不到的代码进行猜测是没有意义的。如果
sizeof(char*)
为2,则只会编写一个
'0'
,snprintf
的计数包括0-终止符。你们是对的,只有一个'0'你们是对的。
csv_row_buffer
有我想要的-
m_csv_data_buffer
缺少一个字节。