printf语句中的子说明符,用于宽度和精度

时间:2013-12-09 07:13:17

标签: c printf

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)使用*.*子说明符的真正目的是什么?

3 个答案:

答案 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.1fprintf函数

     

可选的最小字段宽度。如果转换后的值的字符数少于   字段宽度,它在左侧(或右侧,如果左侧调整标志,稍后描述)填充空间(默认情况下)到字段宽度。字段宽度   采用星号*(稍后描述)或非负十进制整数的形式。

     

一个可选的精度,为di显示最小位数,   ouxX次转化,小数点后显示的位数   aAeEfF次转化的字符,{{的最大有效位数1}}和g转换,或要为G转换写入的最大字节数。精度采用句点形式(s)后跟星号.(稍后描述)或可选的十进制整数;仅当指定了句点时,精度才为零。如果精度与任何其他精度一起出现   转换说明符,行为未定义。

答案 2 :(得分:1)

* - >宽度未在格式字符串中指定,但因此必须格式化参数前面的附加整数值参数。

.* - >格式字符串中未指定精度,但因此必须格式化参数前面的附加整数值参数。

您可以在这里阅读更多内容。 Link