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

发布于 2024-12-12 08:30:34 字数 95 浏览 0 评论 0 原文

我得到一个代码片段,其中

printf("%.*s\n")

%.*s 是什么意思?

I got a code snippet in which there is a

printf("%.*s\n")

what does the %.*s mean?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

一张白纸 2024-12-19 08:30:34

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

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

You can use an asterisk (*) to pass the width specifier/precision to printf(), rather than hard coding it into the format string, i.e.

void f(const char *str, int str_len)
{
  printf("%.*s\n", str_len, str);
}
梦里梦着梦中梦 2024-12-19 08:30:34

更详细的信息请参见此处

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

More detailed here.

integer value or * that specifies minimum field width. The result is padded with space characters (by default), if required, on the left when right-justified, or on the right if left-justified. In the case when * is used, the width is specified by an additional argument of type int. If the value of the argument is negative, it results with the - flag specified and positive field width. (Note: This is the minimum width: The value is never truncated.)

. followed by integer number or *, or neither that specifies precision
of the conversion. In the case when * is used, the precision is
specified by an additional argument of type int. If the value of this
argument is negative, it is ignored. If neither a number nor * is
used, the precision is taken as zero. See the table below for exact
effects of precision.

So if we try both conversion specification

#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;
}

we get the output:

|Hello wo|
|Hello wo|
|     Hello world|
|     Hello world|
合约呢 2024-12-19 08:30:34

我认为上面的代码不正确,但是(根据 printf( )) .* 表示

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

所以它是一个具有可接受宽度作为参数的字符串。

I don't think the code above is correct but (according to this description of printf()) the .* means

The width is not specified in the format string, but as an additional integer value argument preceding the argument that has to be formatted.'

So it's a string with a passable width as an argument.

a√萤火虫的光℡ 2024-12-19 08:30:34

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

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

s 字符串

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

.* The precision is not specified in the format string, but as an additional integer value argument preceding the argument that has to be formatted.

s String of characters

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文