在我的代码中,我使用如下的snprintf,并能够看到以下行为
char text[30] = {0};
snprintf(text, sizeof(text), "%s", "hello");
printf("Interm... %s\n", text);
snprintf(text, "%20s", text);
printf("At the end ... %s\n", text);
Run Code Online (Sandbox Code Playgroud)
Interm... hello
At the end ...
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,snprintf的source和destinaton是否相同,它会清除缓冲区.我希望输出是20s格式说明符.我不能在第一步中执行此操作,因为我需要追加多个字符串并在最后一步执行格式说明符.
是复制到临时缓冲区并从那里到原始缓冲区唯一可能的解决方案?你能不能对此有所了解.
从snprintf 手册页
如果调用sprintf(),snprintf(),vsprintf()或vsnprintf()会导致在重叠的对象之间进行复制(例如,如果目标字符串),则C99和POSIX.1-2001指定结果是未定义的数组和一个提供的输入参数引用相同的缓冲区).
这意味着该行
snprintf(text, "%20s", text)
Run Code Online (Sandbox Code Playgroud)
无效.您建议使用额外的临时缓冲区是正确的.