【发布时间】:2011-12-15 11:51:55
【问题描述】:
我得到了一个代码 sn-p,其中有一个
printf("%.*s\n")
%.*s 是什么意思?
【问题讨论】:
-
没有附加参数,这不是一个有效的
printf调用。
标签: c printf format-specifiers
我得到了一个代码 sn-p,其中有一个
printf("%.*s\n")
%.*s 是什么意思?
【问题讨论】:
printf 调用。
标签: c printf format-specifiers
您可以使用星号 (*) 将宽度说明符/精度传递给 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 将指定应打印的子字符串的长度。
更详细的here。
整数值或
*,指定最小字段宽度。如果需要,结果会用空格字符(默认情况下)填充,右对齐时在左侧,如果左对齐,则在右侧。在使用 * 的情况下,宽度由 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|
【讨论】:
printf("|%.*s|\n", biggerPrecision , greetings);
我不认为上面的代码是正确的,但是(根据printf() 的描述).* 的意思是
宽度没有在格式字符串中指定,而是作为必须格式化的参数之前的附加整数值参数。'
所以它是一个以可传递宽度作为参数的字符串。
【讨论】:
int(或其子集)——而不仅仅是任何整数值,例如更直观的 size_t 或其可能的别名,例如 std::string::size_type。考虑到引用的页面提到 size_t 作为支持的类型说明符之一,这更加令人困惑。
见:http://www.cplusplus.com/reference/clibrary/cstdio/printf/
.*精度未在格式字符串中指定,而是作为必须格式化的参数之前的附加整数值参数。
s字符串
【讨论】: