Answers:
您可以使用星号(*
)将宽度说明符/精度传递给printf()
,而不是将其硬编码为格式字符串,即
void f(const char *str, int str_len)
{
printf("%.*s\n", str_len, str);
}
str_len
参数必须具有类型int
(或更窄的整数类型,将被提升为int
)。这将是传递一个错误long
,size_t
等等
%s
)是打印原始字符串的子字符串。在这种情况下,str
将指向原始字符串内的某个位置(可能在开头),并str_len
指定应打印的子字符串的长度。
这里更详细。
整数值或
*
指定最小字段宽度。如果需要,结果用空格字符填充(默认情况下),在右对齐时在左侧填充,在左对齐时在右侧填充。在使用*的情况下,宽度由类型为int的附加参数指定。如果参数的值为负,则结果将指定为-标志,且字段宽度为正。(注意:这是最小宽度:该值永远不会被截断。)
.
后面跟整数或*,或者都不指定转换的精度。在使用*的情况下,精度由类型为int的附加参数指定。如果此参数的值为负,则将其忽略。如果既不使用数字也不使用*,则精度为零。有关精度的确切影响,请参见下表。
因此,如果我们尝试两种转换规范
#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|
int
(或其一部分),而不仅仅是像更直观的整数值size_t
或可能的别名(如)std::string::size_type
。考虑到所引用的页面提到size_t
的受支持的类型说明符之一,这甚至更加令人困惑。
请参阅:http://www.cplusplus.com/reference/clibrary/cstdio/printf/
.*
精度不是在格式字符串中指定的,而是作为必须格式化的参数之前的附加整数值参数指定的。
s
字串
printf
调用无效。