编写一个程序,把较长的输入行“折”成短一些的多行,折行的位置在输入行的第N列之前的最后一个非空格之后

来源:互联网 发布:js循环数组赋值 编辑:程序博客网 时间:2024/06/05 17:37

MAXCOL是一个符号常量,它给出了输入行的折行位置,即输入行的第N列。整型变量pos是程序在文本行中的当前位置。程序将在输入行的每一处第N列之前对该输入行折行。
该程序把制表符扩展为空格,每遇到一个换行符就把当前的输入文本行打印出来,每当变量pos的值达到MAXCOL时,就对输入行进行折叠。
函数findblnk从输入行的pos处开始倒退着寻找一个空格,目的是为了保持折行位置的单词的完整,如果找到一个空格符,就返回紧跟在该空格符后面的那个位置的下标,如果没有找到空格,就范围MAXCOL

#include <stdio.h>#define TABINC 4#define MAXCOL 10    //指定输入行的折行位置char line[MAXCOL];   /* 全局数组,在以下函数中都能共同访问 */int exptab(int pos);int findblnk(int pos);int newpos (int pos);void printl(int pos); int main(){    int c, pos;        pos = 0;    while ((c = getchar()) != EOF)    {        line[pos] = c;    /* 保存当前的字符 */        if (c == '\t')            pos = exptab(pos);        else if (c == '\n')        {            printl(pos);            pos = 0;        }        else if(++pos >= MAXCOL)   //超过限定的折行字符个数        {            pos = findblnk(pos);               printl (pos);            pos = newpos(pos);        }       }}int exptab(int pos)   /* 将TAB制表符转换为空格 */{    line[pos] = ' ';    for (++pos; pos < MAXCOL && pos % TABINC != 0; ++pos)        line[pos] = ' ';    if (pos < MAXCOL)        return pos;    else    {        printl(pos);        return 0;    }}void printl (int pos)       //打印该行{    int i;    for (i = 0; i < pos; ++i)        putchar(line[i]);    if (pos > 0)        putchar ('\n');}int findblnk (int pos)    /* 往前搜索一个空格,为了保持折行位置的单词完整性 */{    while (pos > 0 && line[pos] != ' ')        --pos;    if (pos == 0)      //没找到空格        return MAXCOL;    else               //找到空格        return pos + 1;}int newpos (int pos)   //调整输入行的位置{    int i, j;    if (pos <= 0 || pos >= MAXCOL)  //重置为0,开始新的折行        return 0;            else    {        i = 0;        for (j = pos; j < MAXCOL; ++j)   //将剩余的字符复制到新的折行开始处        {            line[i] = line[j];            ++i;        }        return i;    }}   
0 0