printf中的"%.*s"是什么意思?

Sha*_*ang 98 c printf format-specifiers

我有一个代码片段,其中有一个

printf("%.*s\n")
Run Code Online (Sandbox Code Playgroud)

什么%.*s意思?

Aus*_*oke 105

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

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

  • 值得一提的是,此代码的可能用途,特别是与`%s`一起使用时,是打印原始字符串的子字符串.在这个用例中,`str`指向原始字符串内的某个地方(可能在开头),而`str_len`将指定应该打印的子字符串的长度. (6认同)
  • 通过指定长度,我们可以绕过打印(或 sprintf) ' 'ing 一个没有空终止符的字符串,例如从任何基于流或文件的源输入的字符串。这是我遇到的用例,而不仅仅是打印漂亮的。 (3认同)
  • 应该注意的是,str_len参数必须具有int类型(或更窄的整数类型,将被提升为int类型)。传递`long`,`size_t`等都是错误。 (2认同)

Ond*_*rej 17

这里更详细.

整数值或*指定最小字段宽度.如果需要,结果将填充空格字符(默认情况下),右对齐时填充左侧,如果左对齐则填充右侧.在使用*的情况下,宽度由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;
}
Run Code Online (Sandbox Code Playgroud)

我们得到输出:

|Hello wo|
|Hello wo|
|     Hello world|
|     Hello world|
Run Code Online (Sandbox Code Playgroud)

  • 您还可以添加`printf(“|%.*s|\n”,bigerPrecision,greetings);` (2认同)

rer*_*run 12

我不认为上面的代码是正确的,但(根据这个描述printf())的.*手段

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

所以这是一个以可通过的宽度作为参数的字符串.

  • 我已经添加了URL交叉引用,因此您可以避免剽窃指控.当然,正确的引用说"_precision_不是......"而不是"_width_不是......". (2认同)

Jos*_*osh 10

请参阅:http://www.cplusplus.com/reference/clibrary/cstdio/printf/

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

s 字符串