【问题标题】:What does "%.*s" mean in printf?printf中的“%.*s”是什么意思?
【发布时间】:2011-12-15 11:51:55
【问题描述】:

我得到了一个代码 sn-p,其中有一个

printf("%.*s\n")

%.*s 是什么意思?

【问题讨论】:

  • 没有附加参数,这不是一个有效的printf 调用。

标签: c printf format-specifiers


【解决方案1】:

您可以使用星号 (*) 将宽度说明符/精度传递给 printf(),而不是将其硬编码到格式字符串中,即

void f(const char *str, int str_len)
{
  printf("%.*s\n", str_len, str);
}

【讨论】:

  • 需要注意的是,str_len 参数的类型必须为int(或更窄的整数类型,将被提升为int)。传递longsize_t 等将是一个错误。
  • 值得一提的是,这段代码的可能用途,尤其是与%s一起使用时,是打印原始字符串的子字符串。在这个用例中,str 将指向原始字符串内部的某个位置(可能在开头),str_len 将指定应打印的子字符串的长度。
  • 通过指定长度,我们可以绕过 print (或 sprintf) 'ing 一个没有空终止符的字符串,例如从任何基于流或文件的源输入的字符串。这是我经常遇到的用例,而不仅仅是打印 prettines。
【解决方案2】:

更详细的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|

【讨论】:

  • 从文档中,'%.*s' 和 '%*s' 之间的主要区别似乎是前者忽略了精度的负值,而后者考虑到应用适当的理由。
  • 你也可以加printf("|%.*s|\n", biggerPrecision , greetings);
【解决方案3】:

我不认为上面的代码是正确的,但是(根据printf() 的描述).* 的意思是

宽度没有在格式字符串中指定,而是作为必须格式化的参数之前的附加整数值参数。'

所以它是一个以可传递宽度作为参数的字符串。

【讨论】:

  • 我添加了 URL 交叉引用,这样您就可以避免抄袭指控。当然,正确的引用是“precision is not ...”而不是“The width is not...”。
  • 正如@MattMcNabb 指出的那样,每次对该页面的引用都必须强调“一个整数值”正是int(或其子集)——而不仅仅是任何整数值,例如更直观的 size_t 或其可能的别名,例如 std::string::size_type。考虑到引用的页面提到 size_t 作为支持的类型说明符之一,这更加令人困惑。
【解决方案4】:

见:http://www.cplusplus.com/reference/clibrary/cstdio/printf/

.* 精度未在格式字符串中指定,而是作为必须格式化的参数之前的附加整数值参数。

s 字符串

【讨论】:

    猜你喜欢
    • 2019-05-27
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多