"%*s"格式说明符是什么意思?

63

我需要维护一些代码,在其中看到了格式说明符%*s。请问这是什么,为什么要使用它?

其用法的示例如下:

fprintf(outFile, "\n%*s", indent, "");

重要的是,所推广的“缩进”类型是“int”。 - chux - Reinstate Monica
6个回答

65

这个函数可以动态地指定字段的宽度:

  • 宽度不是在格式字符串中指定的,而是作为一个额外的整数值参数在需要格式化的参数之前指定。

因此,“缩进”指定要为其后面的字符串在参数列表中分配多少空间。

所以,

printf("%*s", 5, "");

相同。
printf("%5s", "");

这是一种不需要使用循环,便可在文件中添加一些空格的好方法。


5
@EthanHeilman,在scanf函数族中,*号代表完全不同的含义。 - John Hascall
请注意,如果您有一个负数,该字段将左对齐。也就是说,printf("[%*s]\n", -10, "hello") 将输出 "[hello     ]" 而不是 "[     hello]",如果您使用 +10(或 10)则会得到后者。 - Jonathan Leffler

11

不要在一个没有以NULL结尾的缓冲区(压缩)上使用"%*s",认为它只会打印“长度”字段。


34
使用 "%.*s" 来实现这个! - Andy G
@AndyG 我不太明白 '%.*s' 怎么帮助解决这个问题。根据这里的文档,貌似这两个格式说明符之间唯一的区别就是 '%.*s' 忽略负数精度值。 - powersource97
3
@powersource97,%.*s 表示您正在从参数中读取 precision 值,而精度是要打印的最大字符数,而 %*s 您正在从参数中读取 width 值,它是要打印的最小字符数。 - Vargas

5
格式说明符%4s将字符串输出在4个字段宽度内,也就是说,printf会至少以4个字符位置显示该值。
如果要输出的值小于4个字符位置,则默认情况下该值将右对齐在该字段中。
如果该值大于4个字符位置,则字段宽度将扩展以容纳适当数量的字符。
要左对齐该值,请使用负整数来指定字段宽度。
参考资料:Java™ How To Program (Early Objects), Tenth Edition

2

在printf和fprintf中使用:

printf("%*s", 4, myValue); is equivalent to printf("%4s", myValue);

此代码将变量显示为最小宽度,其余的右对齐空格。要左对齐值,请使用负整数。

在scanf和sscanf中使用时:

/* sscanf example */
#include <stdio.h>

int main ()
{
  char sentence []="Rudolph is 12 years old";
  char str [20];
  int i;

  sscanf (sentence,"%s %*s %d",str,&i);
  printf ("%s -> %d\n",str,i);
  
  return 0;
}

输出:

Rudolph -> 12

它用于忽略一个字符串。


1
sscanf() 中,"%s"gets() 更糟糕,因为它缺少宽度限制。 - chux - Reinstate Monica

1

* 使 fprintf 输出字符串时向左填充字符,直到字符串长度达到由修改后的类型前的函数参数(整数值)所指定的 n 字符宽度。

printf("%*d", 5, 10) //will result in "10" being printed with a width of 5.

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接