欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

北航研究生复试2014上机第三题:冒号对齐

程序员文章站 2024-03-12 15:24:50
...

题目:,排版题。输入若干行字符,表示某电影的演职员表,每行只有一个冒号,冒号前面是职位,冒号后面是姓名,要求把各行冒号对齐,删除多余空格后输出。先输入一个数字,表示排版要求的冒号位置,该位置号保证比各行冒号前的最大字符数还要大。再输入若干行字符,最多50行,每行最多100个字符,除空格、制表符和回车之外都是有效字符,要求每行的冒号处于格式要求的位置,冒号两边与有效单词之间各有一个空格,冒号前面的单词之间只有一个空格(删除多余的空格和制表符),在冒号左边右对齐,前面全由空格填充,冒号后面的单词之间也只有一个空格,在冒号右边左对齐,最后一个单词后不加空格直接换行。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


#define ROW 50
#define COL 200

void ReSetStr(char* str, int pos);      //通过':'的位置pos构建新的字符串
int GetMao(char* str ,int len);         //得到原字符串':'的位置 

/*
**  str原字符串 从[begin, end]处的字符 删除多余的空格和制表符  复制到
**  newstr新字符串从pos开始的位置,
**  tag是标记,tag=0,从pos向前复制;tag=1,从pos向后复制
*/
void strcpy_part(char str[COL],int begin,int end,char newstr[COL],int pos, int tag);

bool Judge(char c);                     //判断字符c是否为空格或者制表符

int main(){

    int posOfmao;
    scanf("%d", &posOfmao);
    getchar();
    char str[ROW][COL] = {0};
    int i = 0;
    int size = 0;
    char ch = getc(stdin);
    while(ch != '\n'){          //输入
        while(1){
            if(ch != '\n'){
                str[size][i++] = ch;
                ch = getc(stdin);
            }
            else{
                ++size; i = 0;
                ch = getc(stdin);
                break;
            }
        }
    }

    for(i = 0; i < size; i++)   //处理
        ReSetStr(str[i],posOfmao);

    for(i = 0; i < size; i++)   //输出
        printf("%s\n", str[i]);

    return 0;
}

void ReSetStr(char* str, int pos){
    int len = strlen(str);
    char newstr[COL];
    for(int i = 0; i < COL; i++)
        newstr[i] = ' ';
    int pos_be = GetMao(str ,len);
    int posbefore = pos_be;
    int posafter = len - pos_be - 1;

    newstr[pos - 1] = ':';
    //newstr[pos] = newstr[pos - 2] = ' ';
    strcpy_part(str,0,posbefore - 1,newstr,pos - 3,0);          //向前复制
    strcpy_part(str,posbefore + 1,len - 1 , newstr, pos + 1,1);//向后复制
    strcpy(str,newstr);                                        //整体复制
}   


int GetMao(char* str ,int len){
    for(int i = 0; i < len; i++)
        if(str[i] == ':')
            return i;
    return -1;
}

void strcpy_part(char str[COL],int begin,int end,char newstr[COL],int pos, int tag){
    if(tag == 0){//从;往前
        int del = 1;
        while(end >= begin){
            if(Judge(str[end]) == false){   //为空格或者制表符
                if(del == 1){   //已经写入一个空格 需要删除多余的空格或制表符
                    while(!Judge(str[end])){//循环找到不为空格或制表符的下标
                        --end;
                    }
                    del = 0;
                }else if(del == 0){         //还没有写入,写入一个空格
                    newstr[pos--] = ' ';
                    del = 1;
                    --end;
                }
            }else{                          //不为空格或者制表符,直接复制
                newstr[pos--] = str[end--];
                del = 0;
            }
        }
    }else if(tag == 1){//从;往后
        int del = 1;
        while(begin <= end){
            if(Judge(str[begin]) == false){ //为空格或者制表符
                if(del == 1){   //已经写入一个空格 需要删除多余的空格或制表符
                    while(!Judge(str[begin])){  //循环找到不为空格或制表符的下标
                        ++begin;
                    }
                    del = 0;
                }else if(del == 0){             //还没有写入,写入一个空格
                    newstr[pos++] = ' ';
                    del = 1;
                    ++begin;
                }
            }else{                              //不为空格或者制表符,直接复制
                newstr[pos++] = str[begin++];
                del = 0;
            }
        }
        newstr[pos] = '\0';                     //末尾结束,添加\0
    }
}

bool Judge(char c){
    if(c == ' ' || c == '\t')
        return false;
    return true;
}

输入:
50
we are family : hero dfghk
sfghfh giyio: gihikjk jnk
you rteo vc:fvjodf
hkdjlgf wreterh cxv:pgods
输出
北航研究生复试2014上机第三题:冒号对齐

相关标签: 机试