【藍橋杯2015_C++】t4:格子中輸出

這題考冷門知識點,提前科普:

下面這段來自C++ reference的printf(),*可作爲一個設置輸出寬度的佔位符:

翻譯了一下:

(number) 要打印的最小字符數。如果要打印的值小於此數字,則結果將用空格填充。即使結果更大,也不會截斷該值。

*               寬度不是在格式字符串中指定的,而是作爲必須格式化的參數前面的附加整數值參數指定的。

可能還是看不懂,舉個例子:

 printf ("Width trick: %*d \n", 5, 10); 

輸出結果:Width trick:    10

這裏的*相當於一個設置寬度的數字的佔位符,表示後面的這個%d要佔多少個字符。我們可以數一下,10前面有4個空格。

下面我們來看代碼:

 1 /*
 2 格子中輸出
 3 StringInGrid函數會在一個指定大小的格子中打印指定的字符串。
 4 要求字符串在水平、垂直兩個方向上都居中。
 5 如果字符串太長,就截斷。
 6 如果不能恰好居中,可以稍稍偏左或者偏上一點。
 7 下面的程序實現這個邏輯,請填寫劃線部分缺少的代碼。
 8 對於題目中數據,應該輸出:
 9 +------------------+
10 | ? ? ? ? ? ? ? ? ?|
11 | ? ? abcd1234 ? ? |
12 | ? ? ? ? ? ? ? ? ?|
13 | ? ? ? ? ? ? ? ? ?|
14 +------------------+
15 */
16 #include <stdio.h>
17 #include <string.h>
18 void StringInGrid(int width, int height, const char* s)
19 {
20     int i,k;
21     char buf[1000];
22     strcpy(buf, s);
23     if(strlen(s)>width-2) buf[width-2]=0;
24     
25     printf("+");
26     for(i=0;i<width-2;i++) printf("-");
27     printf("+\n");
28     
29     for(k=1; k<(height-1)/2;k++){
30         printf("|");
31         for(i=0;i<width-2;i++) printf(" ");
32         printf("|\n");
33     }
34     
35     printf("|");
36     
37 //    printf("%*s%s%*s",--------------------------------------); //填空
38 
39     
40     printf("|\n");
41     
42     for(k=(height-1)/2+1; k<height-1; k++){
43         printf("|");
44         for(i=0;i<width-2;i++) printf(" ");
45         printf("|\n");
46     }    
47     
48     printf("+");
49     for(i=0;i<width-2;i++) printf("-");
50     printf("+\n");    
51 }
52 
53 
54 int main()
55 {
56     StringInGrid(20,6,"abcd1234");
57     return 0;
58 }
View Code

可以先把要填空的地方註釋掉運行一下:

很明顯,我們要填的就是居中打印字符串的代碼。

經過上面對*的分析,我們大概已經能看懂這個 "%*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,""); 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章