snprintf格式说明符

Kir*_*jan 2 c string printf

在我的代码中,我使用如下的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格式说明符.我不能在第一步中执行此操作,因为我需要追加多个字符串并在最后一步执行格式说明符.

是复制到临时缓冲区并从那里到原始缓冲区唯一可能的解决方案?你能不能对此有所了解.

sim*_*onc 6

snprintf 手册页

如果调用sprintf(),snprintf(),vsprintf()或vsnprintf()会导致在重叠的对象之间进行复制(例如,如果目标字符串),则C99和POSIX.1-2001指定结果是未定义的数组和一个提供的输入参数引用相同的缓冲区).

这意味着该行

snprintf(text, "%20s", text)
Run Code Online (Sandbox Code Playgroud)

无效.您建议使用额外的临时缓冲区是正确的.