我有一段代码片段
printf("%.*s\n")
%.*s是什么意思?
%.*s
您可以使用星号(*)将宽度说明符/精度传递给 printf(),而不是将其硬编码为格式字符串,即。
*
printf()
void f(const char *str, int str_len) { printf("%.*s\n", str_len, str); }
我不认为上面的代码是正确的,但是(根据 printf()的描述) .*意味着
.*
宽度不在格式字符串中指定,而是作为必须格式化的参数之前的附加整数值参数指定。'
所以它是一个带有可通过宽度作为参数的字符串。
见: http://www.cplusplus.com/reference/clibrary/cstdio/printf/
精度不在格式字符串中指定,而是作为必须格式化的参数之前的附加整数值参数指定。 字符串
精度不在格式字符串中指定,而是作为必须格式化的参数之前的附加整数值参数指定。
字符串
更详细的 给你。
指定最小字段宽度的整数值或 *。结果用空格字符(默认情况下)填充(如果需要) ,在右对齐时放在左边,在左对齐时放在右边。在使用 * 的情况下,宽度由 int 类型的附加参数指定。如果参数的值为负,则会产生指定的-Flag 和正字段宽度。(注意: 这是最小宽度: 值从不截断。) .后面跟着整数数字或 * ,或者既不指定精度也不指定精度 如果使用 * ,则精度为 类型的附加参数指定 参数为负,则忽略该参数 如果使用,则精度为零。请参阅下表以获得精确值 精确度的影响。
指定最小字段宽度的整数值或 *。结果用空格字符(默认情况下)填充(如果需要) ,在右对齐时放在左边,在左对齐时放在右边。在使用 * 的情况下,宽度由 int 类型的附加参数指定。如果参数的值为负,则会产生指定的-Flag 和正字段宽度。(注意: 这是最小宽度: 值从不截断。)
.后面跟着整数数字或 * ,或者既不指定精度也不指定精度 如果使用 * ,则精度为 类型的附加参数指定 参数为负,则忽略该参数 如果使用,则精度为零。请参阅下表以获得精确值 精确度的影响。
.
因此,如果我们尝试两个转换规范
#include <stdio.h> int main() { int precision = 8; int biggerPrecision = 16; const char *greetings = "Hello world"; printf("|%.8s|\n", greetings); printf("|%.*s|\n", precision , greetings); printf("|%16s|\n", greetings); printf("|%*s|\n", biggerPrecision , greetings); return 0; }
我们得到了输出:
|Hello wo| |Hello wo| | Hello world| | Hello world|