首页 > 技术文章 > 第六届蓝桥杯省赛4格子中输出

AllenMi 2020-09-14 20:36 原文

题目描述:

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;
}

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

题目答案:

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

题目思路:

看到if(strlen(s)>width-2) buf[width-2]=0;就说明如果字符串长度大于width-2,就已经把字符串截断了,所以在下面填空输出的时候,只需要考虑字符串前后的空格就好了。

printf("%*s%s%*s",_________________); //填空

前后的%*s输出的是空格,我们只要计算一下所需要的空格数量就行,(width-2-strlen(buf))/2,

然后输出前后空格+buf字符串就行!

待补充知识点:

  1. char字符串中某位赋值为零相当于从此截断:

    样例代码:

    #include <stdio.h>
    #include <string.h>
    //@start: 2020-09-14 20:13:39
    
    int main()
    {
        char s[3]={'a','b','c'};
        s[1]=0;
        printf("字符串内容:%s\n",s);
        printf("字符串长度:%d",strlen(s));
        return 0;
    }
    

    样例输出:

  2. printf("%*s",10," ");的用法:

    样例代码:

    #include <stdio.h>
    #include <string.h>
    //@start: 2020-09-14 20:13:39
    
    int main()
    {
        char s[] = "abc";
        printf("%*s",10,s);
        return 0;
    }
    

    样例截图:

    输出字符串s,但是至少占10个位置,不足会在左侧补空格。

推荐阅读