c语言 - printf() 的字符串宽度对于未终止的字符串安全吗?



以下定义是否正确?

const char not_a_c_string[] = { 'h', 'e', 'l', 'l', 'o' };
printf( "%.5s", (const char*) not_a_c_string );

这是一个关于特定形式"%.5s"的问题,而不是一个如何打印可能不是NUL终止的字符串因为这个问题已经在这里得到了回答,这里提出了"%.*s"构造。

首先,我相信您想问的是精度,而不是字段宽度。所以,你的例子是看起来像

 printf( "%.5s", (const char*) not_a_c_string );  //precision

而不是

 printf( "%5s", (const char*) not_a_c_string );   //field width.

考虑到上述方法,不,在您的示例中不会是UB。

引用C11标准,第7.21.6.1章,fprintf函数,第8段,(emphasis mine

s nbsp nbsp nbsp nbsp nbsp nbsp;如果不存在l长度修饰符,则参数应为指向初始值的指针字符类型数组的元素(280)数组中的字符为写至(但不包括)终止的null字符。如果如果指定了精度,则写入的字节数不超过该数量如果未规定精度或精度大于阵列大小时,阵列应包含一个null字符

因此,只有在

  • 缺少精度
  • 所提供的精度是所提供的CCD_ 8阵列的大小CCD_

在您的情况下,提到的精度(5)不大于数组的大小(也是5)。所以,这很好。


FWIW,如果示例保持

 printf( "%5s", (const char*) not_a_c_string );

那么它将是UB,因为你会在那里失去精度。

最新更新