printf()的冷门用法+格子中输出--蓝桥杯

##首先先看题目
格子中输出

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",_____________________________________________);  //填空
         
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;
}

对于题目中数据,应该输出:
±-----------------+
| |
| abcd1234 |
| |
| |
±-----------------+

(如果出现对齐问题,参看【图1.jpg】)

在这里插入图片描述

今天才见过这个用法,不会做,然后看了这个博主的答案
https://blog.csdn.net/rl529014/article/details/50737009)
我觉得有一点点瑕丝,就是当width为奇数时就不满足题意了。
例如:
当width = 25时;输出为:
在这里插入图片描述
我的答案:

printf("%*s%s%*s",(width-2-strlen(buf))/2," ",buf,width - (width-2-strlen(buf))/2 - strlen(buf) -2," ");  //填空

这个冷门用法就是:
https://stackoverflow.com/questions/1000556/what-does-the-s-format-specifier-mean
https://stackoverflow.com/questions/1000556/what-does-the-s-format-specifier-mean
(图片是在stackoverflow上截的)

猜你喜欢

转载自blog.csdn.net/qq_40691051/article/details/84326267