char str[] = "some text"; printf ( "%.*s", strlen(str), str );
** Of course, their buffers, strings yet to be properly targeted
char str[] = "some text"; printf ( "%.*s", strlen(str), str );
** Of course, their buffers, strings yet to be properly targeted
不,这只是将检测字符串结尾的问题从 printf 转移到 strlen,它仍然完全相同。
不, printf 应该是安全的表单溢出无论如何设置字段宽度并没有真正帮助
在您给出的示例中,没有区别。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
.
不,它与以下内容没有什么不同:
char str[] = "some text";
printf("%s", str);