如何使用snprint()函数追加字符串

时间:2010-08-10 07:10:58

标签: c

#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()

由于 苏里亚

4 个答案:

答案 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);