关于printf的一道笔试题

#include <stdio.h>
#define N 19

main()
{
    int i;
    for(i=0;i<=N;i++)
    {
        printf("%*.*s%-*.*s\n",N,i<=N/2?i:N-i,"*******************",N,i<=N/2?i+1:N
            -i+1,"*******************");
    }

}

 

如果写printf("%s","**********************")相信看得懂

%m.ns中间的m.n是对%s的修饰符,
   m表示字符串显示时的最大宽度,超过的会被截掉,
      n表示显示字符串中的几个字符,
   如果n<m,则数据靠右对齐显示

%-m.ns,其它和上面一样,只是靠左对齐

%*.*s 两个星号类似通配符,它的实际值由后面的参数决定
如printf("%*.*s",m,n,"********")就等价于%m.ns

现在这段好理解了
printf("%*.*s%-*.*s\n",N,i<=N/2?i:N-i,"*******************",N,i<=N/2?i+1:N-i+1,"*******************");
将屏幕分成19+19两半,前面一半由%*.*s控制,后面一半由%-*.*s控制

当 i<=N/2时,每行输出 i+(i+1)=2i+1 个星号
当 i>N/2 时,每行输出 (N-i)+(N-i+1)=2(N-i)+1 个星号

原文地址:https://www.cnblogs.com/libao/p/2483022.html