2015年藍橋杯省賽c語言b組 格子中輸出
題目:
格子中輸出 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;
}
對於題目中資料,應該輸出:
注意:只填寫缺少的內容,不要書寫任何題面已有程式碼或說明性文字。
分析:
1、首先分析StringInGrid函式中 strcpy(buf, s);if(strlen(s)>width-2)
buf[width-2]=0;這兩行程式碼,它們是將s陣列的內容複製發到buf陣列中,然後判斷陣列的有效長度是否比所給寬度長,並將多出的部分進行刪減。
2、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"); }這幾行程式碼則是將要輸出陣列buf中的內容的上方所有需要的空格和線條進行填充。 3、
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"); }
這幾行程式碼則是將要輸出陣列buf中的內容的下方所有需要的空格和線條進行填充。4、所以我們改函式還剩下一個功能就是打印出應該出現的陣列內容部分,我們需要找到列印陣列內容前需要的空格數量和列印完陣列內容後需要的空格數量。根據題目可以清楚的知道,陣列內容居中,則兩邊空格的數量應該相等並且數量為(格子寬度-2-陣列內容長度)/2。
則缺失部分的程式碼應該為:(width-2-strlen(buf))," “,buf,(width-2-strlen(buf)),” "
補充部分:
% * s的作用: 1、在scanf中使用,則添加了*的部分會被忽略(跳過),不會被引數獲取。
例如:
int a,b;
char b[10];
scanf("%d%*s",&a,b);
輸入為:
12 abc
那麼12將會讀取到變數a中,但是後面的abc將在讀取之後拋棄,不賦予任何變數(例如這裡的字元陣列b)
用*和掃描集配合,可以從輸入中只選出需要的內容,而忽略其餘的東西。
另外,也常用於清空緩衝區。
2、在printf中使用,表示用後面的形參替代的位置,實現動態格式輸出。
例如:
printf("%*s", 10, s);
/意思是輸出字串s,但至少佔10個位置,不足的在字串s左邊補空格,這裡等同於printf("%10s", s);/printf("%.*s\n",int,str) ;
// %.*s 其中的.*表示顯示的精度 對字串輸出(s)型別來說就是寬度
// 這個*代表的值由後面的引數列表中的整數型(int)值給出
例如:
printf("%.*s\n", 1, “abc”);// 輸出a
printf("%.*s\n", 2, “abc”);// 輸出ab
printf("%.*s\n", 3, “abc”);// 輸出abc >3是一樣的效果 因為輸出型別type = s,遇到’\0’會結束