如何使用printf()实现变量字段宽度?

rit*_*ala 4 c printf

问题是 :

如何使用printf()?实现可变字段宽度?也就是说,%8d应该在运行时指定宽度.

基于上面的问题,我在互联网上遇到了一些C代码,但由于我是C编程的新手,我无法对代码做出正面或反面.我发布以下代码:

#include <stdio.h>

int main()
{
   const char text[] = "Hello world";
   int i;
   for ( i = 1; i < 12; ++i )
   {
      printf("\"%.*s\"\n", i, text);
   }


    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Sou*_*osh 7

首先,让我告诉你,你所展示的代码是关于控制精度,而不是字段宽度.对于缩短的形式**

 %A.B<format specifier>
Run Code Online (Sandbox Code Playgroud)

A表示字段宽度B并使精度.

现在,引用C11标准,章节§7.21.6.1,fprintf()(强调我的)

每个转换规范由字符%引入.在%之后,以下顺序出现:

[..]

  • 可选的精度是给出的最小位数出现的d,i, o,u,x,和X转换,为小数点字符后出现的位数a,A,e,E,f,和F转换的显著位数的最大数目的gG转换,或字节的最大数目为被写入s的转换.精度采用句点(.)的形式,后跟星号*(稍后描述)或可选的十进制整数 ; 如果仅指定了句点,则精度为零.如果精度与任何其他转换说明符一起出现,则行为未定义.

如上所述,字段宽度或精度或两者可以用星号表示.在这种情况下,int参数提供字段宽度或精度.[...]

所以,在你的情况下,

printf("\"%.*s\"\n", i, text);
Run Code Online (Sandbox Code Playgroud)

提供的精度i可以在运行时保持不同的值.


完整的格式(为便于阅读,在单独的行中分解)

%
<Zero or more flags>
<optional minimum field width>
<optional precision>
<optional length modifier>
<A conversion specifier character>
Run Code Online (Sandbox Code Playgroud)