在不使用指针算术的情况下,将格式化字符串附加到C中的字符串(不是C+;+;)?

在不使用指针算术的情况下,将格式化字符串附加到C中的字符串(不是C+;+;)?,c,pointers,C,Pointers,编写了一个非常简单的C函数来说明我想简化的内容: void main(int argc, char *argv[]){ char *me="Foo"; char *you="Bar"; char us[100]; memset(us,100,0x00); sprintf(us,"You: %s\n",you); sprintf(us+strlen(us),"Me: %s\n",me); sprintf(us+strlen(us),"We

编写了一个非常简单的C函数来说明我想简化的内容:

void main(int argc, char *argv[]){
    char *me="Foo";
    char *you="Bar";
    char us[100];
    memset(us,100,0x00);

    sprintf(us,"You: %s\n",you);
    sprintf(us+strlen(us),"Me: %s\n",me);
    sprintf(us+strlen(us),"We are %s and %s!\n",me,you);
    printf(us);
}
似乎应该有一个标准的库函数来处理我用sprintf做的事情,并推进指针,不是吗?我已经好几年没有做过任何

谢谢,
-aj

您可能正在寻找(甚至更好)。

sprintf
返回写入的非NUL字符数

int len = 0;
len += sprintf(us+len, ...);
len += sprintf(us+len, ...);
...

嗯…你就不能用这样的东西吗

sprintf(us, "You: %s\nMe: %s\nWe are %s and %s!\n, you, me, me, you);

切勿将非常量字符串用作
printf
的第一个参数(或
fprintf
的第二个参数)。这是错误的做法。请尝试将
me
变量更改为
“muahahaha%n%d%n%d%n%d%n%d%n”
并向堆栈告别,向
SEGFAULT
问好
printf
将尝试格式化字符串,但您没有为它提供任何要处理的参数,即使字符串中有格式说明符
printf
也不知道您没有给它任何参数


如果要输出“预格式化”字符串,请使用
fputs(str,stdout)
。很少有情况将
printf
与非常量格式字符串一起使用。

先格式化,然后进行串联。@AJ,不,您可以使用相同的缓冲区,只需将catting放在最后即可(虽然,这有点低效,因为每次调用
strcat
/
strncat
,它都需要重新扫描整个字符串)。哈,我想这稍微简单一点,但仍然是以同样的方式完成的。不。您的示例每次迭代都调用strlen(),这使得sprintf()的数量为O(N^2)调用。这利用了printf函数家族返回打印字符数以免费获得strlen结果的事实。事实上,这是这类事情的标准习惯用法。并且一如既往:确保您正在测试缓冲区长度,如果这是任何可以处理不可信数据的事,请使用snprintf请不要
printf(us)
printf(“%s”,us)
fputs(us,stdout)
更安全。与这个问题无关,sprintf()也是邪恶的。更新了,谢谢。
sprintf
只要你对缓冲区的大小有信心就可以了。另一方面,
printf(us)
花费额外的工作来扫描
%
,即使它是安全的,也不应该有。“似乎应该有一个标准的库函数”,c stdlib不像其他语言(如Java)那样广泛,所以我怀疑这一点is@hhafez,重点介绍;重新过渡到使用C语言思考(与Python和Java相比)正是我所处的位置。对于符合SUS的系统:
sprintf(美国,“您:%1$s\nMe:%2$s\n我们是%2$s和%1$s!\n”,您,我)
@hhafez,不,dreamlax说使用文本以外的字符串是危险的,因为它可能包含未传递参数的格式说明符,调用未定义的行为。这是处理用户输入时更大的问题,因为它会使您受到攻击(永远不要在用户输入时调用printf(str))但是,如果您的程序生成错误的格式字符串,也会出现问题。@hhafez:
printf
用于根据格式描述字符串和提供的参数打印格式化字符串。如果您提供了预格式化字符串而没有参数,则说明您没有正确使用
printf
。如果您想逐字输出字符串,请使用专用于此目的的函数,如
fputs
。如果使用
printf
输出非常量预格式化字符串,则可能会让
printf
再次格式化字符串的一部分。恶意用户可以提供格式说明符作为输入(如
%n
%d
)您的应用程序肯定会崩溃。
sprintf(us, "You: %s\nMe: %s\nWe are %s and %s!\n, you, me, me, you);