c - 用于字符串连接的 snprintf

标签 c string

我正在使用 snprintf 将字符串连接到 char 数组:

char buf[20] = "";
snprintf(buf, sizeof buf, "%s%s", buf, "foo");
printf("%s\n", buf);
snprintf(buf, sizeof buf, "%s%s", buf, " bar");
printf("%s\n", buf);

问题是 buf 的第二次连接不是添加 "bar",而是用它替换 "foo"。输出如下:

foo
bar

第一个 %s 应该保留 buf(在本例中包含 "foo")。第二个 %s 应该附加 "bar" 到它。对吧?

我做错了什么?

最佳答案

您违反了 snprintf 上的 restrict 约定,其中规定没有其他参数可以与缓冲区重叠。

无论如何,将输入复制到自身是一种浪费。 snprintf 返回格式化所需的字符数,因此利用它来附加:

char buf[20] = "";
char *cur = buf, * const end = buf + sizeof buf;
cur += snprintf(cur, end-cur, "%s", "foo");
printf("%s\n", buf);
if (cur < end) {
    cur += snprintf(cur, end-cur, "%s", " bar");
}
printf("%s\n", buf);

关于c - 用于字符串连接的 snprintf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12065286/

相关文章:

r - 使用grepl提取R中的子字符串

java - java加密解密中如何将String转换为byte[]?

c - 在不使用标准函数的情况下在 C 中生成正弦信号

c++ - 我可以使用变量来指定结构成员数组的大小吗?

c# - 一个字符串在 x64 中占用多少字节?

c++ - 直接读入 std::string 有什么问题吗?

ios - 如何开始使用 OpenGL ES?

c - C中的合并链表

c - 为什么 vfork 会产生这个输出?

java - 如果文件中的字符串可能包含任意字符,您将如何分隔它们?