我正在阅读一些代码,我在阅读 printf 语句时遇到了困难:
printf("%*s%s\n", stat[type].dent, "", buf);
states[type].indent
是一个等于 4 的数字,并且buf
是 215 字节的缓冲区,其中 0 作为字符串存储在其中,但不确定""
并且%*s
是用于的。
任何人都可以帮我阅读这份printf
声明吗?
我正在阅读一些代码,我在阅读 printf 语句时遇到了困难:
printf("%*s%s\n", stat[type].dent, "", buf);
states[type].indent
是一个等于 4 的数字,并且buf
是 215 字节的缓冲区,其中 0 作为字符串存储在其中,但不确定""
并且%*s
是用于的。
任何人都可以帮我阅读这份printf
声明吗?
*
格式代码中的告诉"%*s"
下printf
一个参数是字段宽度,后跟普通参数(在本例中为字符串)。
它与"%4s"
您的情况相同,但宽度可以在运行时设置。
所以这里stat[type].dent
是字段宽度,空字符串是字符串。所以这会打印出 4 个字符宽度的空字符串(所以你会得到四个空格),然后是buf
.
我推荐一个很好的参考资料,了解printf
所有文档的记录位置。
这*
意味着要打印的参数的宽度取决于它前面的(整数)参数。
printf ("Width trick: %*d \n", 5, 10); // 5 is the width, 10 is the integer being printed
这%*s
是一个字符串转换。这*
部分意味着该字段的宽度将作为参数提供(这stat[type].dent
就是使用方式)。所以它以某个指定的宽度打印一个空字符串(称为 N)。换句话说,它在打印出来之前会留下 N 个空格buf
。
*
将被替换为stat[type].dent
数字的值,称为最小字段宽度。
它是一个精度,它指定字符串转换的最大字节数。
星号 (*),使用整数参数,它指定要使用的值(用于精度)。
要打印可变长度的字符串,请指定printf("%*s", l, string)
. 用l
星号代替。
"%*s%s\n"
是一种包含3 个指令的格式。
"%*s"
该指令是字符串转换规范。*
导致字段宽度 an由int
格式后的下一个参数确定。正如 OP 所提到的,这是来自 4 的值stat[type].dent
。然后s
转换规范获取下一个参数 ( ""
) 并将其视为指向 的指针char *
,它就是。因此printf()
打印出来""
,根据需要先用空格预填充,最多 4 个。这里需要 4 个填充空格,因为 的字符串长度""
为 0。净结果:打印 4 个空格。
"%s"
这个指令,也是一个字符串转换规范,接受下一个参数,,buf
假设它是一个char *
,它就是,并打印出它的内容。不清楚 OP 是否意味着全为0,如果是,则不打印任何内容。
"\n"
这个最终指令只是一个文本,因此"\n"
被打印出来。