2014-01-23 50 views
2

我在C++中遇到过这行代码。我不确定我是否理解语法。两个变量传递给printf,但只显示一个数字。使用%。 in printf

printf("Value of bar is: [%.*s]\n", tok->len, tok->ptr); 
+5

不是问题,但'printf'实际上是C,它不应该用在C++中。 –

+2

@StefanoSanfilippo如果你是C++的粉丝,但不是,你会用什么? – Brandin

+1

@Brandin:Boost格式。 – MSalters

回答

7

格式字符串

%.*s 

消耗两个参数。第一个指定精度,第二个是要打印的值。

因此假设tok->len的值为3。然后在你的问题的代码就相当于:

printf("Value of bar is: [%.3s]\n", tok->ptr); 

了解更多关于这从文档的良好来源,例如:http://en.cppreference.com/w/cpp/io/c/fprintf

至于什么精度是指在这种情况下,文档源上面说:

Precision指定要写入的最大字节数。

这是一个稍微马虎的写法。它应该说字符而不是字节。

+0

有趣的是“最大字节数”是N1570使用的措辞。在这里使用“字节”似乎很重要,因为这意味着转换说明符“sl”的行为非常奇怪。 – pmr

3

从printf的手册页下段The flag characters

精度

可选的精度,在一个周期的形式( '')后跟 可选的十进制数字字符串。 而不是一个十进制数字字符串 可能会写入“*”或“* m $”(对于某些十进​​制整数m)来指定 精度在下一个参数或第m个参数中给出 分别必须是int类型。如果精度为 只是'。',或者精度为负值,则精度取为 零。这给出了对于d,i,o, u,x和X转换出现的最小数字位数,即对于a,e,E,f和F转换,在 基数字符后面出现的位数,g和G转换的最大有效位数 ,或最大值 要从字符串中打印的字符数(s和S 转换)。

强调我的。

你的情况%.*s表示下一个参数表示要解释为要打印的下列字符串参数的最大字符数的精度。