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

最佳答案

它们主要用于打印数字(int、float),但对于字符串也很有用。
*用于设置输出字符串的最小长度。
.*用于设置输入字符串的最大长度。
*.*用于设置输入字符串的最大长度和输出字符串的最小长度。
示例:

printf("%*s\n", 3, "ABCDE");
printf("%.*s\n", 3, "ABCDE");
printf("%*.*s\n", 5, 3, "ABCDE");

输出:
ABCDE
ABC
  ABC

关于c - printf语句中的子说明符以获取宽度和精度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20465126/

10-13 01:07