将较长的输入行折成短一些的两行或多行

#include<stdio.h>

#define   MAXCOL   15
#define   TABINC   5

char  line[MAXCOL];

int exptab(int pos);
int findblnk(int pos);
int newpos(int pos);
void printl(int pos);

main()
{
    int c, pos;
    
    pos = 0;
    while((c = getchar()) != EOF){
        line[pos] = c;           //将采集到的字符存入数组
        if(c == '\t')            //遇到\t
            pos = exptab(pos);   //分两种情况
        else if(c == '\n'){        //遇到\n   直接打印输出
            printl(pos);
            pos = 0;
        }else if(++pos >= MAXCOL){    //要折行的情况 在MAXCOL-1列处
            pos = findblnk(pos);  //分两种情况   无空格 返回MAXCOL-1 打印 有空格返回空格后面的一个地址
            printl(pos);
            pos = newpos(pos); //无空格情况pos=0  有空格情况pos=后面字符的个数  新的line[]里面的东西将连着下面的字符
        }
    }
}

void printl(int pos)
{
    int i;
    for(i = 0; i < pos; ++i)
        putchar(line[i]);
    if(pos > 0)    
        putchar('\n');
}

int exptab(int pos)   //功能在与将pos之后且没到制表符点的都变成空格  
{
    line[pos] = ' ';        //将空格赋予数组
    for(++pos; pos < MAXCOL && pos % TABINC != 0; ++pos)
        line[pos] = ' ';  
    if(pos < MAXCOL)  //制表符点之后小于MAXCOL
        return pos;
    else{
        printl(pos);  //到达最后一个制表符点了 打印该数组及\n
        return 0;
    }
}

int findblnk(int pos)  //找空格
{
    while(pos > 0 && line[pos] != ' ')    //若在MAXCOL-1处没有空格
        --pos;                     //一直减  直到遇到第一个空格
    if(pos == 0)      //都是字符没有空格
        return MAXCOL;
    else
        return pos + 1;  //找到空格  在此之后+1
}

int newpos(int pos)  //从pos处之后成新的行
{
    int i, j;
    if(pos <= 0 || pos >= MAXCOL)  //无空格的情况
        return 0;
    else{                          //界限内        
        i = 0;                       
        for(j = pos; j < MAXCOL; ++j){      // 将多余的复制到新的一行
            line[i] = line[j];
            ++i;
        }
        return i;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值