lhm的博客

平时的一些学习笔记

将较长的输入行折成短一些的两行或多行
#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;
    }
}

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012323667/article/details/52374040
个人分类: C语言
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭