转换说明符是否s
指定了字符的书写方向/顺序?
N3220 工作草案,7.23.6p8(重点添加):
s 如果不存在 l 长度修饰符,则参数应为指向字符类型存储的指针。326)存储中的字符将写入到(但不包括)终止空字符。如果指定了精度,则写入的字节数不会超过该值。如果未指定精度或精度大于存储的大小,则存储应包含一个空字符。
这是否意味着以下程序:
#include <stdio.h>
int main(void)
{
char s[] = {'x', '\0', 'y'};
printf("%s", s);
}
可以打印吗y
?
尽管书写方向/顺序可能很明显,但它是否具体说明?
不,该代码不行。
给定,,
char s[] = { various};
其中printf("%s", s);
,数组s
被转换为第一个数组元素的地址。因此printf()
接收一个指针,并且不知道数组的大小s
。“存储中的字符被写入到……”暗示指针会随着后续字符而递增。
字符数一直持续到遇到空字符(不打印该空字符)。
s[]
空字符后面的字符不会被打印,也不会被访问。如果使用精度说明符,则当遇到空字符或已打印说明符计数的字符时,打印将停止。
'y'
因此,即使缺少后续的空字符,代码也可以打印。屏幕上的书写方向(从左到右、从右到左等)是终端界面的功能。绝大多数情况下,它是从左到右的。此特性和其他终端特性(如字体大小、字体、颜色)都是终端特定的。此类设备(尤其是多语言设备)上的文本输出也允许从右到左。此类 I/O 细节不是 C 的一部分。
处理字符的顺序是从最低地址到最高地址,由 C 指定。
转换说明符
s
旨在输出一个字符串:以空字符 ('\0'
) 终止的字符序列。因此这个 printf 调用
对于声明
s
为将输出字符,
'x'
因为数组包含字符串{ 'x', '\0' }
或其他表示形式"x"
。根据引文
如果您要指定精度,例如
然后再次根据引用输出字符串
"x"
。该字符
'y'
在任何情况下都不会被输出,因为它存在于数组中存储的字符串之外。尽管如此,如果你想使用数组中存储的字符串之外的
'y'
转换说明符输出字符,你可以这样写s
s
另一方面,如果数组包含以下字符
并且你只想
'x'
使用转换说明符输出字符s
,你可以像上面所示那样指定精度也就是精度允许输出字符串的一部分。