4.格子中输出(新知识点Get)
StringInGrid函数会在一个指定大小的格子中打印指定的字符串。
要求字符串在水平、垂直两个方向上都居中。
如果字符串太长,就截断。
如果不能恰好居中,可以稍稍偏左或者偏上一点。
下面的程序实现这个逻辑,请填写划线部分缺少的代码`
#include <stdio.h>
#include <string.h>
void StringInGrid(int width, int height, const char* s)
{
int i,k;
char buf[1000];
strcpy(buf, s);
if(strlen(s)>width-2) buf[width-2]=0;
printf("+");
for(i=0;i<width-2;i++) printf("-");
printf("+\n");
for(k=1; k<(height-1)/2;k++)
{
printf("|");
for(i=0;i<width-2;i++) printf(" ");
printf("|\n");
}
printf("|");
printf("%*s%s%*s",(width-2-strlen(s))/2," ",buf,(width-1-strlen(s))/2," "); //填空,
// %*s%s%*s 输出的方式是 长度," ",字符串,长度," "
//计算字符两边的空格数,此处就是 buf 两边的空格数,(width-strlen(s)-2)/2。
printf("|\n");
for(k=(height-1)/2+1; k<height-1; k++)
{
printf("|");
for(i=0;i<width-2;i++) printf(" ");
printf("|\n");
}
printf("+");
for(i=0;i<width-2;i++) printf("-");
printf("+\n");
}
int main()
{
StringInGrid(20,6,"abcd1234");
return 0;
}
---------------------
作者:@Star
来源:CSDN
原文:https://blog.csdn.net/qq_39825375/article/details/86795288
版权声明:本文为博主原创文章,转载请附上博文链接!
思路:
- 修饰符:如果写成printf(“%6d”, 123),很多同学应该就不会陌生了,这是设置域宽的意思。同理,%6s也是域宽。* 修饰符正是用来更灵活的控制域宽。使用%*s,表示这里的具体域宽值由后面的实参决定,如printf(“%*s”,6, “abc”)就是把”abc”放到在域宽为6的空间中右对齐
- 结果应该是printf("%*s%s%*s",(width-2-strlen(buf))/2, " ", buf, (width-1-strlen(buf))/2, " ");(后一个为减1,考虑奇偶)