[第六届蓝桥杯省赛C++B组格子中输出

题目来源:第六届蓝桥杯省赛C++B组

考点标签:语法*s,字符串

题目描述:

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; 

对于题目中数据,应该输出:

在这里插入图片描述

注意:只填写缺少的内容,不要书写任何题面已有代码或说明性文字。

思路

由代码行

strcpy(buf,s);

我们知道s,拷贝给了buf;

我们需要填空的代码为printf("%*s%s%*s",_______________________________); //填空
这里我们要清晰*s的用法,即参数为2("*s",数量,实际填充字符)
因为我们要得到上图的造型,则我们先尝试填写,printf("%*s%s%*s",10," ",buf,10," ");
得到下图
在这里插入图片描述
于是此时我们只需要减少两边的空格量即可。
那么一边空格的长度就应该为width - strlen(buf) - 2) / 2//即宽度减去字符长再减去两个便|字符再除以2

答案

printf("%*s%s%*s", (width - strlen(buf) - 2) / 2, " ", buf, (width - strlen(buf) - 2) / 2, " ");
发布了155 篇原创文章 · 获赞 18 · 访问量 3912

猜你喜欢

转载自blog.csdn.net/weixin_43910320/article/details/105139064