sprintf将字符串插入到自身中

时间:2018-04-15 11:12:29

标签: c printf

看一下这段代码:

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,它的效果也出乎意料。

1 个答案:

答案 0 :(得分:7)

使用

sprintf(r, c, 65, c, 66);

你确实让r包含了你期望的字符串。 但是 然后你做

printf(r);

将解释字符串%中的r序列,并尝试为其查找匹配的参数。由于没有传递参数,您将拥有undefined behavior

如果您只想在r中打印字符串,请使用例如而是puts

puts(r);

这就是你永远不应该将用户输入的字符串作为格式字符串传递给printf族函数的原因。这是一个非常糟糕的安全漏洞。