#include<stdio.h>
main()
{
char str[50] = "Wel %s";
char dst[50];
snprintf(dst,50,str,"Come");
//Now i want to append "*" to dst string ie "Wel Come*" using snprintf()
printf("str = %s\n",str);
printf("dst = %s\n",dst);
}
请建议使用snprintf()
由于 苏里亚
答案 0 :(得分:2)
显而易见的解决方案:
snprintf(dst,50,"%s*",dst);
效率低下,因为它会制作 dst
(自身)的不必要副本。
调用未定义的行为,如R.指出,因为参数可能不重叠(来自MacOSX上的man snprintf(3)):
“[...]或写入的例程 用户提供的字符串,即 字符串和格式字符串应该 不重叠,因为行为是 未定义“。
Posix说:
“如果在之间进行复制 由于a而重叠的对象 调用sprintf()或snprintf(),. 结果未定义。“
snprintf
会返回已写入的字符数,因此您可以这样做:
int k=snprintf(dst,50,str,"Come");
// make sure that we do not pass potential disastrous values to snprintf, because
// the size argument is unsigned (size_t, 50-52 is a large positive number!)
// and we want 50-k to be in the range 0-50
// k<0 means output error and k>50 means "output truncated". There is no point in
// appending anything in these cases anyway.
if (k<0 || k>50)
{
fprintf(stderr,"output error or buffer too small");
}
else k=snprintf(dst+k,50-k,"*");
// check k for truncation here.
然后总是strcat
......为了以防万一,你忽略了它。你可以在第一时间附上*附件:
main()
{
char str[50] = "Wel %s*"; //<--!!!
[...]
答案 1 :(得分:2)
这应该有效:
#include<stdio.h>
int main()
{
char str[50] = "Wel %s";
char dst[50];
int len;
snprintf(dst,50,str,"Come");
//get size of current string
len = strlen(dst);
//add character to the end
snprintf(dst + len, sizeof(dst) - len, "*");
printf("str = %s\n",str);
printf("dst = %s\n",dst);
return 0;
}
答案 2 :(得分:1)
您可以使用%s
格式:
snprintf(dst, 50, "%s*", dst);
编辑:这似乎有一些未定义的行为。最好的方法是询问是否真的有必要使用snprintf
代替strncat
。
答案 3 :(得分:0)
您已经可以使用所有信息:
snprintf(dst + 8, sizeof(dst) - 8, "%s", "*");
你最好这样做:
strncat(dst, "*", sizeof(dst) - strlen(dst) - 1);