看一下这段代码:
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
,它的效果也出乎意料。
答案 0 :(得分:7)
使用
sprintf(r, c, 65, c, 66);
你确实让r
包含了你期望的字符串。 但是 然后你做
printf(r);
将解释字符串%
中的r
序列,并尝试为其查找匹配的参数。由于没有传递参数,您将拥有undefined behavior。
如果您只想在r
中打印字符串,请使用例如而是puts
:
puts(r);
这就是你永远不应该将用户输入的字符串作为格式字符串传递给printf
族函数的原因。这是一个非常糟糕的安全漏洞。