#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 个星号