這題考冷門知識點,提前科普:
下面這段來自c++ reference的printf(),*可作為乙個設定輸出寬度的佔位符:
翻譯了一下:
(number) 要列印的最小字元數。如果要列印的值小於此數字,則結果將用空格填充。即使結果更大,也不會截斷該值。可能還是看不懂,舉個例子:* 寬度不是在格式字串中指定的,而是作為必須格式化的引數前面的附加整數值引數指定的。
printf ("
width trick: %*d \n
", 5, 10);
輸出結果:width trick: 10
這裡的*相當於乙個設定寬度的數字的佔位符,表示後面的這個%d要佔多少個字元。我們可以數一下,10前面有4個空格。
下面我們來看**:
1/*2view code格仔中輸出
3stringingrid函式會在乙個指定大小的格仔中列印指定的字串。
4要求字串在水平、垂直兩個方向上都居中。
5如果字串太長,就截斷。
6如果不能恰好居中,可以稍稍偏左或者偏上一點。
7下面的程式實現這個邏輯,請填寫劃線部分缺少的**。
8對於題目中資料,應該輸出:
9+------------------+
10| ? ? ? ? ? ? ? ? ?|
11| ? ? abcd1234 ? ? |
12| ? ? ? ? ? ? ? ? ?|
13| ? ? ? ? ? ? ? ? ?|
14+------------------+
15*/
16 #include 17 #include
18void stringingrid(int width, int height, const
char*s)
1934
35 printf("|"
);36
37//
printf("%*s%s%*s",--------------------------------------);
//填空
3839
40 printf("
|\n"
);41
42for(k=(height-1)/2+1; k1; k++)
4748 printf("+"
);49
for(i=0;i2;i++) printf("-"
);50 printf("
+\n"
); 51}
5253
54int
main()
55
可以先把要填空的地方注釋掉執行一下:
很明顯,我們要填的就是居中列印字串的**。
經過上面對*的分析,我們大概已經能看懂這個 "
%*s%s%*s
" 的意思了,就是要列印的字串前需要有多少空位,後面又需要有多少空位。
先試著填兩個數字上去: printf("
%*s%s%*s
",10,"",buf,10,""); ,執行一下:
數了下,前面10個空格,後面10個空格。大概能看明白了,因為要居中,其實左右邊的空格數都是一樣的,就是寬度-2-字串長度(-2是有兩個'|')
填空: printf("
%*s%s%*s
",(width-2-strlen(buf))/2,"",buf,(width-2-strlen(buf))/2,"");
2015藍橋杯 4 格仔中輸出
題目描述 stringingrid函式會在乙個指定大小的格仔中列印指定的字串。要求字串在水平 垂直兩個方向上都居中。如果字串太長,就截斷。如果不能恰好居中,可以稍稍偏左或者偏上一點。下面的程式實現這個邏輯,請填寫劃線部分缺少的 include include void stringingrid in...
藍橋杯 格仔中輸出
參考 格仔中輸出 stringingrid函式會在乙個指定大小的格仔中列印指定的字串。要求字串在水平 垂直兩個方向上都居中。如果字串太長,就截斷。如果不能恰好居中,可以稍稍偏左或者偏上一點。下面的程式實現這個邏輯,請填寫劃線部分缺少的 如圖 include include void stringin...
格仔中輸出 藍橋杯
格仔中輸出 stringingrid方法會在乙個指定大小的格仔中列印指定的字串。要求字串在水平 垂直兩個方向上都居中。如果字串太長,就截斷。如果不能恰好居中,可以稍稍偏左或者偏上一點。下面的程式實現這個邏輯,請填寫劃線部分缺少的 public static void stringingrid int...