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;
}
}