sprintf将字符串插入到自身中

mda*_*sev 2 c printf

看看这段代码:

char *c = "%c %s %c";
char *r = malloc(100 * sizeof(char));
printf(c, 65, c, 66);
Run Code Online (Sandbox Code Playgroud)

它按照我的预期和打印工作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);
Run Code Online (Sandbox Code Playgroud)

它输出A B.我知道如果在重叠的对象之间进行复制,结果是未定义的.我不知道这是否适用于我的情况,因为源和目标不重叠,只有格式字符串和其中一个参数.我的主要问题是如何在printf没有打印的情况下获得行为,而是将结果存储到内存中.顺便说一句,我也尝试过sprintf,它的工作也出乎意料.

Som*_*ude 8

sprintf(r, c, 65, c, 66);
Run Code Online (Sandbox Code Playgroud)

你确实r包含了你期望的字符串.但是你呢

printf(r);
Run Code Online (Sandbox Code Playgroud)

它将解释%字符串中的序列r并尝试为其查找匹配的参数.由于没有传递参数,因此您将具有未定义的行为.

如果您只想按r原样打印字符串,请使用eg puts代替:

puts(r);
Run Code Online (Sandbox Code Playgroud)

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