2014年北航机试第三题-排版题
题目描述
输入若干行字符,表示某电影的演职员表,每行只有一个冒号,冒号前面是职位,冒号后面是姓名,要求把各行冒号对齐,删除多余空格后输出。
先输入一个字,表示排版要求的冒号位置该位置号保证比各行冒号前的最大字符数还要大。再输入若干行字符,最多50行,每行最多100个字符,除空格、制表符和回车之外都是有效字符,要求每行的冒号处于格式要求的位置,冒号两边与有效单词之间各有一个空格,冒号前面的单词之间只有一个空格(删除多余的空格和制表符),在冒号左边右对齐,前面全由空格填充,冒号后面的单词之间也只有一个空格,在冒号右边左对齐,最后一个单词后不加空格直接换行。
C代码
/*gets(str) 函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间。*/
/*使用 gets() 时,系统会将最后“敲”的换行符从缓冲区中取出来,然后丢弃,所以缓冲区中不会遗留换行符。
这就意味着,如果前面使用过 gets(),而后面又要从键盘给字符变量赋值的话就不需要吸收回车清空缓冲区了,
因为缓冲区的回车已经被 gets() 取出来扔掉了。*/
#include<stdio.h>
#include<string.h>
int main(){
char str[51][101];//存储字符串
int n,p=0,len=0,i=0,j=0;
int len2=0;//当前字符串的长度
char cur[101];
scanf("%d",&n);//n代表冒号的位置
getchar();//scanf输入后回车符进入缓冲区,用getchar()缓冲掉
while(p<=50){
gets(str[p]);//用gets()来输入每行语句,当下一行为空行时,跳出循环
if(str[p][0]=='\0'){
break;
}
p++;
}
//排版并输出
for(i=0;i<p;i++){
j=0;
len=0;
while(str[i][j]!=':'){//把冒号前边的字符存入cur[]中
cur[j]=str[i][j];
j++;
len++;//冒号前边字符串的长度
}
j=0;
while(j<n-len){//求得为了对齐应该输入的空格个数
printf(" ");
j++;
}
len2=strlen(str[i]);//当前字符串的长度
for(j=0;j<len2;j++){
if(str[i][j]!=':'){//不是冒号原样输出
printf("%c",str[i][j]);
}
if(str[i][j]==':'){//冒号则两边多加一个空格
printf(" : ");
}
}
printf("\n");
}
return 0;
}