蓝桥杯2015第六届C语言B组省赛习题题解——习题D.格子中输出

每日刷题(十六)

蓝桥杯第六届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;
}

运行结果如下:
在这里插入图片描述

如果喜欢我的文章,请记得三连哦,点赞关注转发,欢迎各位志同道合的IT友人在评论区讨论交流,只要我看到了,一定会回复,感谢您的支持,下期更精彩!!!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值