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

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值