我正在阅读一些代码,我在阅读 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"被打印出来。