题意: 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 }