C 编写一个类似printf的函数,它可以清除第一个参数之后的所有参数,使其不受“%”符号的影响

C 编写一个类似printf的函数,它可以清除第一个参数之后的所有参数,使其不受“%”符号的影响,c,security,printf,variadic-functions,C,Security,Printf,Variadic Functions,。。。撞车 上面的行会导致错误。我想写一个函数,它可以像printf一样使用,但可以在第一个参数之后清除所有参数,以确保它们不包含%符号。函数应该像“printf”一样使用,因为它可以接受任意数量的参数,并以相同的方式打印字符串。如果其他参数包含%符号,我只希望在将该符号放入格式字符串之前将其去掉 如果这个新函数被称为safe_printf,我希望其行为如下: user_input = "%s%s%s%s%s%s%s%s"; printf("user input is: %s", user_in

。。。撞车

上面的行会导致错误。我想写一个函数,它可以像printf一样使用,但可以在第一个参数之后清除所有参数,以确保它们不包含%符号。函数应该像“printf”一样使用,因为它可以接受任意数量的参数,并以相同的方式打印字符串。如果其他参数包含%符号,我只希望在将该符号放入格式字符串之前将其去掉

如果这个新函数被称为safe_printf,我希望其行为如下:

user_input = "%s%s%s%s%s%s%s%s";
printf("user input is: %s", user_input);
用户输入为:ssss


似乎编写这样的函数是不可能的,我不知道有多少个字符,就不知道如何预处理va_列表中的字符。如果是这样,请告诉我。谢谢

如果将用户提供的输入传递给printf3函数,则存在字符串格式漏洞。你可以通过永远不允许这种情况发生来防止这种情况。绝对没有理由使用动态格式字符串,因为您应该提前知道所需的格式,因此您可以通过使用常量char*将格式字符串放入只读内存中。

显示的“用户输入”不会使printf崩溃。如果您使用printfuser_输入,它可能会崩溃,仅使用一个参数或用户输入控制格式的其他变量。您的safe_printf调用不正确;你有第二个双引号…在错误的地方;或者实际上,它完全不见了。崩溃可能是因为您试图从不可修改的字符串文字中删除百分比符号;它们一般是不可写的。我对printf的行为感到困惑。我没有意识到格式字符串是唯一能够导致这种崩溃的参数。谢谢你的澄清。
user_input = "%s%s%s%s%s%s%s%s";
safe_printf("user input is: %s, user_input);