蓝桥杯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友人在评论区讨论交流,只要我看到了,一定会回复,感谢您的支持,下期更精彩!!!

发布了40 篇原创文章 · 获赞 7 · 访问量 3120

猜你喜欢

转载自blog.csdn.net/qq_44631615/article/details/104353333