printf("%*s",4,"*****"+4);解释
printf("%*s/n",6,"*****"+0); 解释 //收藏baidu一个问题,对自己有点用!
1.先从%*s解释起,printf的%后面的格式是:
%[flags] [width] [.precision] [{h | l | ll | I | I32 | I64}]type
这些参数的详细用法请参考msdn:
http://msdn2.microsoft.com/en-us/library/56e442dc(VS.80).aspx
这里我只说重点:其中参数[width]和参数[.precision]如果用*表示,代表这两个值是一个输入参数,因为本例中是%*s不是%.*s,因此可以肯定这个*代表了[width]([flags]不能用*表示).
[width]参数表示了一个宽度,如果输入的字符串很小,长度不到这个宽度,那么会用[flags]参数的值来填充,如果[flags]为空,就用空格来填充.
本例子中[width]=4,因此如果%s的字符串小于4,那么前面会用空格填充.
2."*****"+4,表示什么,在c中字符串"******"表示一个指针地址,"******"+4 表示的是这个指针+4,因此结果是一个"*",你可以试试"*****"+1,和"abcdf"+4,结果一个是"****",一个是"f".
如果还不理解,试试下面的程序:
char *ss="abcdf";
printf("%s,%s,%s,%s,%s",ss,ss+1,ss+2,ss+3,ss+4);
总结:这个printf表示的是:打印一个字符串,如果字符串不足4,用空格补齐,字符串的其实地址是"*****"+4,也就是第4个"*"的位置,打印结果" *"
=========================================
printf("%*s/n",6,"*****"+0);
输出长度不足6,用6个空格补齐,现在你的*已经有5个了,因此只用补一个空格。
printf("%*s/n",6,"********"+0);
这个一个空格都没有,全部是*,长度不足才补齐,而且是缺多少补多少
ch = "123456780123";
int n = 2,m = 10;
//*.* ,前边的*定义的是总的宽度,后边的定义的是输出的个数。
//如果后边的比前边的小,则使用空格在左侧补够m位。
printf("%*.*s/n",m,n,ch);//这里输出“ 12”
printf("%*.*s/n",n,m,ch);//这里输出“1234567890”