每日刷题(十六)
蓝桥杯第六届C语言B组省赛习题
习题D:格子中输出
图1.jpg
这是一个结果填空题
#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("|\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;
}
这里我们不妨先把填空部分剪切掉,运行后可以得到
而填空部分就是我们的字符串内容,从strcpy(buf, s);我们已知s的内容已经复制到buf中了
接下来要考虑居中问题,也是本题的重点之一
对于宽度为20,高度为6的框架,如果填入的字符长度为8,即刚好可以居中,左边四个空格字符,右边也四个空格,若字符长度为9,那么可以稍微偏左,则
左边(width - 2 - strlen(buf)) / 2 = 4个空格字符,
右边(width - 1 - strlen(buf)) / 2 = 5个空格字符
这里还有一个知识点,那就是%*s%s%*s
这里是官方文件有关这个的内容
前者是指宽度的限定,后者指精度的限定,用*表示宽度、精度未指定,而如果有%5d等,表示域宽为五个空格,但是对于%5s,我试验了一下,没有什么作用。
这里我举个例子,
#include<stdio.h>
int main()
{
printf ("Width trick:%*s \n", 15, " ","Levi_Champion");
return 0;
}
运行结果
题目中%*s%s%*s,也就是说左右两个是设定空格长度,中间的是字符内容,那么这个题就填
printf("%*s%s%*s",(width - 2 - strlen(buf)) / 2," ",buf,(width - 1 - strlen(buf)) / 2," ");
以下是完整代码
#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(buf)) / 2," ",buf,(width - 1 - strlen(buf)) / 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;
}
运行结果如下: