题意: StringInGrid函数会在一个指定大小的格子中打印指定的字符串。要求字符串在水平、垂直两个方向上都居中。如果字符串太长,就截断。如果不能恰好居中,可以稍稍偏左或者偏上一点。下面的程序实现这个逻辑,请填写划线部分缺少的代码。
思路:被各种输出空搞晕了,不过看的题解上的原题,一拿该是有些出入的。
开始以为的输出应该是 int len1 = (width - 2 - strlen(s)) / 2; int len2 = (width - 1 - len1 - strlen(s)); printf("%*s%s%*s", len1, " ", s, len2, " "); 应该是 int len1 = (width - 2 - strlen(s)) / 2; int len2 = (width - 1 - len1 - strlen(s)); printf("%*s%s%*s", len1, "", s, len2, ""); 错误在于当len1 == 0 时,第一个会多输出一个空格。%*s,前边的参数是字符串占的位数,后边的是要输出的字符串。当字符串长度不够该占的位数时,会用空格补齐。但是超过的时候就不会了。所以会出现上述错误。

附right代码:

 1 /*
 2  StringInGrid函数会在一个指定大小的格子中打印指定的字符串。
 3  要求字符串在水平、垂直两个方向上都居中。
 4  如果字符串太长,就截断。
 5  如果不能恰好居中,可以稍稍偏左或者偏上一点。
 6 
 7  下面的程序实现这个逻辑,请填写划线部分缺少的代码。
 8  */
 9 
10 #include <stdio.h>
11 #include <string.h>
12 
13 void StringInGrid(int width, int height, const char* s)
14 {
15     int i, k;
16     char buf[1];
17     strcpy(buf, s);  // 长度为1的字符数组,复制?
18     if (strlen(s)>width - 2) buf[width - 2] = 0; // 截断字符串。为什么大于宽度减去2的时候就截断?
19                                                  // 意思是,要想居中两边必须都至少留一个格子?
20     printf("+");
21     for (i = 0; i<width - 2; i++) printf("-");
22     printf("+\n"); // 边框宽
23 
24     for (k = 1; k<(height - 1) / 2; k++)
25     {
26         printf("");
27         for (i = 0; i<width - 2; i++) printf(" ");
28         printf("\n");
29     }
30 
31       printf(""); //????
32 
33     // printf("%*s%s%*s", (width-strlen(s)-2)/2, "",s,(width-strlen(s)-1)/2,""); //输出字符串!格式就是参数
34     int len1 = (width - 2 - strlen(s)) / 2;
35     int len2 = (width - 1 - len1 - strlen(s));
36     printf("%*s%s%*s", len1, "", s, len2, "");
37 
38     printf("\n");
39 
40     for (k = (height - 1) / 2 + 1; k<height - 1; k++)
41     {
42         printf("");
43         for (i = 0; i<width - 2; i++) printf(" ");
44         printf("\n");
45     }
46 
47     printf("+");
48     for (i = 0; i<width - 2; i++) printf("-");
49     printf("+\n");
50 }
51 
52 int main()
53 {
54     StringInGrid(20, 6, "abcd1234");
55     return 0;
56 }
View Code

 

posted on 2016-03-01 18:51  小小八  阅读(271)  评论(0编辑  收藏  举报