如何使用snprint()函数追加字符串 #包括 main() { char str[50]=“Wel%s”; char-dst[50]; snprintf(dst,50,str,“Come”); //现在我想使用snprintf()将“*”附加到dst字符串,即“Wel Come*” printf(“str=%s\n”,str); printf(“dst=%s\n”,dst); }

如何使用snprint()函数追加字符串 #包括 main() { char str[50]=“Wel%s”; char-dst[50]; snprintf(dst,50,str,“Come”); //现在我想使用snprintf()将“*”附加到dst字符串,即“Wel Come*” printf(“str=%s\n”,str); printf(“dst=%s\n”,dst); },c,C,请建议是否可以使用snprintf() 谢谢 苏里亚您可以使用%s格式: #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); prin

请建议是否可以使用snprintf()

谢谢
苏里亚

您可以使用
%s
格式:

#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
而不是
strncat

您可以使用
%s
格式:

#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
而不是
strncat

显而易见的解决方案:

snprintf(dst, 50, "%s*", dst);
效率低下,因为它将不必要的
dst
(复制到自身中)

调用R.指出的未定义行为,因为参数可能不会重叠(来自MacOSX上的man snprintf(3)):

“[…]或那些写入 用户提供的字符串,即 字符串和格式字符串应 不重叠,因为行为是 未定义。”

Posix说:

“如果复制发生在 由于碰撞而重叠的对象 调用sprintf()或snprintf(),则 结果未定义。”

snprintf
返回它已写入的字符数,因此您可以执行以下操作:

snprintf(dst,50,"%s*",dst);
显而易见的解决方案是:

snprintf(dst, 50, "%s*", dst);
效率低下,因为它将不必要的
dst
(复制到自身中)

调用R.指出的未定义行为,因为参数可能不会重叠(来自MacOSX上的man snprintf(3)):

“[…]或那些写入 用户提供的字符串,即 字符串和格式字符串应 不重叠,因为行为是 未定义。”

Posix说:

“如果复制发生在 由于碰撞而重叠的对象 调用sprintf()或snprintf(),则 结果未定义。”

snprintf
返回它已写入的字符数,因此您可以执行以下操作:

snprintf(dst,50,"%s*",dst);
这应该起作用:

main()
{
 char str[50] = "Wel %s*"; //<--!!!
[...]
#包括
int main()
{
char str[50]=“Wel%s”;
char-dst[50];
内伦;
snprintf(dst,50,str,“Come”);
//获取当前字符串的大小
len=strlen(dst);
//在末尾添加字符
snprintf(dst+len,sizeof(dst)-len,“*”;
printf(“str=%s\n”,str);
printf(“dst=%s\n”,dst);
返回0;
}
这应该可以:

main()
{
 char str[50] = "Wel %s*"; //<--!!!
[...]
#包括
int main()
{
char str[50]=“Wel%s”;
char-dst[50];
内伦;
snprintf(dst,50,str,“Come”);
//获取当前字符串的大小
len=strlen(dst);
//在末尾添加字符
snprintf(dst+len,sizeof(dst)-len,“*”;
printf(“str=%s\n”,str);
printf(“dst=%s\n”,dst);
返回0;
}

所有信息都已提供给您:

#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;
}
你最好做:

snprintf(dst + 8, sizeof(dst) - 8, "%s", "*");

所有信息都已提供给您:

#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;
}
你最好做:

snprintf(dst + 8, sizeof(dst) - 8, "%s", "*");


请编辑主题标题-函数名缺少基本字符,而不仅仅是
snprintf(dst,50,str,“Come*”)@nos:是吗?哪一部分?哇,我不知道我是否见过这样一个问题,答案比这个更危险。小心。@R。。我不知道我是否见过一个用户如此盲目地对答案进行向下投票,并像你一样留下“无所不知”的评论。因此,这是一个旨在分享你的知识的社区网站。你知道唯一正确的答案吗?很好,与我们分享,发布答案。否则,试着对他人更具建设性和礼貌一点。请编辑主题标题-函数名缺少基本字符,而不仅仅是
snprintf(dst,50,str,“Come*”)@nos:是吗?哪一部分?哇,我不知道我是否见过这样一个问题,答案比这个更危险。小心。@R。。我不知道我是否见过一个用户如此盲目地对答案进行向下投票,并像你一样留下“无所不知”的评论。因此,这是一个旨在分享你的知识的社区网站。你知道唯一正确的答案吗?很好,与我们分享,发布答案。否则,试着对他人更具建设性和礼貌一点。嗨,Nathan Fellman,上述操作的输出将导致dst=*-Surya@suryak:我们假设您希望使用两个snprintf构建输出<代码>snprintf(dst,50,str,“Come”);snprintf(dst,50,“%s*”,dst)确实会构建“Wel code*”@Nathan:我就是这么想的。在技术上应该可以工作,但在这里不工作。@all:看起来glibc对此有问题。此代码的行为未定义,因为目标字符串和要格式化的参数之一重叠。您好Nathan Fellman,上述操作的输出将导致dst=*-Surya@suryak:我们假设您希望使用两个snprintf<代码>snprintf(dst,50,str,“Come”);snprintf(dst,50,“%s*”,dst)确实会构建“Wel code*”@Nathan:我就是这么想的。在技术上应该可以工作,但在这里不起作用。@all:看起来glibc对此有问题。此代码的行为未定义,因为目标字符串和要格式化的参数之一重叠。在一致的平台上,
snprintf
将返回写入
dst
的字符数,不包括终止的空字符。它不返回写入的数字。如果缓冲区足够大,足以存储整个输出,则返回本应写入的数字;如果输出大小超过
INT\u MAX
,则返回错误时的-1。如果
len>sizeof(dst)
,则第二次调用的size参数将非常大(在32位平台上约为40亿),并且
snprintf
将写入缓冲区的末尾。@R:关于
snprintf()
的说法是正确的。我恢复了a