看看这段代码:
char *c = "%c %s %c";
char *r = malloc(100 * sizeof(char));
printf(c, 65, c, 66);
它按我预期的那样工作并打印 A %c %s %c B
。但是当我尝试使用 sprintf 时:
char *c = "%c %s %c";
char *r = malloc(100 * sizeof(char));
sprintf(r, c, 65, c, 66);
printf(r);
它输出A B
。
我知道如果复制发生在重叠的对象之间,结果是不确定的。我不知道这是否适用于我的情况,因为源和目标不重叠,只有格式字符串和参数之一。我的主要问题是如何在不打印的情况下获得 printf
行为,但将结果存储到内存中。顺便说一句,我也尝试过使用 sprintf
并且它的效果也出乎意料。
最佳答案
与
sprintf(r, c, 65, c, 66);
您确实使 r
包含您期望的字符串。 但是然后你就可以了
printf(r);
它将解释字符串 r
中的 %
序列并尝试为其找到匹配的参数。由于没有传递任何参数,您将得到 undefined behavior .
如果您只想按原样打印 r
中的字符串,请使用例如puts
相反:
puts(r);
这就是您永远不应将用户输入的字符串作为格式字符串传递给 printf
系列函数的原因。这是一个非常严重的安全漏洞。
关于c - sprintf 将字符串插入自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49841266/