c - sprintf 将字符串插入自身

标签 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 并且它的效果也出乎意料。

最佳答案

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/

相关文章:

c - 语法错误: '{'

c - 为什么在不对变量进行任何修改的情况下,两个 printf 语句之间打印的指针变量地址不同?

c - 从 C 中的同一个文件中读取 int 和 char

c - syslog 记录包含http请求数据的字符串

c - 如何在 C 中定义一个接受格式化输入字符串的函数?

c - 为什么代码片段 printf 的输出是 ("%. %. %. ");变成%.0 %.0 %.0?

java - Java 的 printf() 是一种不好的做法吗?

使用预构建的静态库进行编译

r - 如何使用 sprintf 函数向字符添加前导 "0"而不是空格?

c - 缓冲区管理和从串行数据中提取帧