我正在使用 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/