1
char str[] = "some text";

printf ( "%.*s", strlen(str), str );

** Of course, their buffers, strings yet to be properly targeted

4

4 回答 4

3

不,这只是将检测字符串结尾的问题从 printf 转移到 strlen,它仍然完全相同。

于 2009-11-24T17:56:11.750 回答
1

不, printf 应该是安全的表单溢出无论如何设置字段宽度并没有真正帮助

于 2009-11-24T17:54:56.013 回答
1

在您给出的示例中,没有区别。printf 将未修饰的“%s”字符代码解释为“从字符指针读取并打印所有字符,直到遇到空字符”。初始化程序char str[] = "some text";会自动附加空字符,因此不会出现溢出。另一方面,以下是不安全的

char str[] = {'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd'};
printf("%s", str);

因为没有空字符附加到字符序列str。另一方面,由于通过在遇到 null 之前计算字符数来确定字符串长度,因此与仅在未指定字段宽度的情况下 strlen(str)使用相比,它不会为您提供任何好处。printf

结果:为字符串指定字段宽度有帮助的唯一情况是,当字符串不能保证为空终止时(或使用sprintf写入可能不足以容纳的缓冲区的经典情况) )的内容str,但在这种情况下,您必须使用strlen.

于 2009-11-24T18:01:08.247 回答
0

不,它与以下内容没有什么不同:

char str[] = "some text";
printf("%s", str);
于 2009-11-24T18:21:52.853 回答