任何人都可以向我解释这些输出背后的逻辑吗?我猜这里*用作抑制字符,但我无法弄清楚输出.
main()
{
char *s="hello world";
int i=7;
printf("%.*%s",s);
}
Run Code Online (Sandbox Code Playgroud)
输出:%s
如果你替换printf语句,printf("%,*%s",s)那么你的输出将是*hello world ???
printf格式字符串"%.*%s"无效.该*字符不被视为转换抑制说明符,而是作为.指定精度的字符的参数.
与以下内容比较:
printf("%.*s", 3, str);
Run Code Online (Sandbox Code Playgroud)
其中*将下一个参数(3)作为精度字段(对字符串具有特定含义),然后s获取字符串.由于它3是常量,这相当于在格式字符串中对其进行硬编码:
printf("%.3s", str);
Run Code Online (Sandbox Code Playgroud)
所以你在这里%.*看到的是具有可变精度字段的转换的开始.它将使用s参数并将其视为一个int未定义的行为.
即使下一个参数实际上是一个int,接下来发生的事情是,%遵循*变量precision 的字符不是有效的转换说明符.或者,它是一个有效的转换说明符,作为%%转换的一部分.但%%编纂文字的顺序%不支持两个字符之间的可选材料.ISO 9899:1999(%说明者)说"完整的转换规范应该是" %%.
它还说"如果转换规范无效,则行为未定义." 一%%,你像一个宽度和精度场之间有材料规格,是无效的,因为它违反了明确规定的要求,即"完整的转换说明应该%%."