gcc (GCC) 4.1.2
c89
代码:
LOG(DEBUG, "state changed [ %d ] [ %.*s ]",
call_id,
(int)call_info.state_text.slen,
call_info.state_text.ptr);
根据手册页,我只是想知道%.*s
。
* The width is not specified in the format string, but as an additional integer value argument preceding the argument that has to be formatted.
.* The precision is not specified in the format string, but as an additional integer value argument preceding the argument that has to be formatted.
1)我只是想知道上面的printf语句中宽度和精度之间有什么区别。
2)第二个参数是一个整数,它将是要打印的字符串的长度。但是,所有字符串都应该是nul终止的,所以你如何才能获得字符串的长度?
3)有什么理由你不能做以下事情吗?
LOG(DEBUG, "state changed [ %d ] [ %s ]",
call_id,
call_info.state_text.ptr);
4)使用*
和.*
子说明符的真正目的是什么?
答案 0 :(得分:3)
这些主要用于打印数字(int,float),但它们对字符串也很有用。
*
用于设置输出字符串的最小长度。
.*
用于设置输入字符串的最大长度。
*.*
用于设置输入字符串的最大长度和输出字符串的最小长度。
示例:
printf("%*s\n", 3, "ABCDE");
printf("%.*s\n", 3, "ABCDE");
printf("%*.*s\n", 5, 3, "ABCDE");
输出:
ABCDE
ABC
ABC
答案 1 :(得分:2)
%s
家庭功能中的printf
格式说明符:
%5s
这样的 宽度用于最小字段宽度。
像%.5s
这样的精确度用于最大要写入的字节数。
*
说明符,表示将提供额外的int
参数作为字段宽度或精度。尽管如此,它对宽度和精度格式之间的差异没有影响。
相关C标准:
C11§7.21.6.1
fprintf
函数可选的最小字段宽度。如果转换后的值的字符数少于 字段宽度,它在左侧(或右侧,如果左侧调整标志,稍后描述)填充空间(默认情况下)到字段宽度。字段宽度 采用星号
*
(稍后描述)或非负十进制整数的形式。一个可选的精度,为
d
,i
显示最小位数,o
,u
,x
和X
次转化,小数点后显示的位数a
,A
,e
,E
,f
和F
次转化的字符,{{的最大有效位数1}}和g
转换,或要为G
转换写入的最大字节数。精度采用句点形式(s
)后跟星号.
(稍后描述)或可选的十进制整数;仅当指定了句点时,精度才为零。如果精度与任何其他精度一起出现 转换说明符,行为未定义。
答案 2 :(得分:1)
*
- >宽度未在格式字符串中指定,但因此必须格式化参数前面的附加整数值参数。
.*
- >格式字符串中未指定精度,但因此必须格式化参数前面的附加整数值参数。
您可以在这里阅读更多内容。 Link