第7周 C语言程序设计(新2版) 练习1-22 在第n列将较长输入行折短

问题及代码:

/*把较长的行,折成二行或多行,
位置在第n列前的最后一个非空格字符之后.
这个程序将把制表符扩展为空格,每遇到
一个换行符就把此前的输入文本打印出来,
pos达到MAXCOL时折叠。*/
#include<stdio.h>
#define MAXCOL 10 //输入行的折行位置,即第n列
#define TABINC 8  //空白增量大小,为何定义这个
int i,c;
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);      
         }  
     }
}
/*打印输入行直到pos位置的字符*/
void printl(int pos)
{
   int i;
   for(i=0;i<pos;i++)
       putchar(line[i]); 
   if(pos>0)
       putchar('\n'); //注意别忘记了换行符
}
/*扩大空白标签*/
int exptab(int pos)
{
   line[pos]=' ';
   for(++pos;pos<MAXCOL&&TABINC!=0;++pos)
        line[pos]=' ';
   if(pos<MAXCOL)
      return pos;
   else
      {
        printl(pos);
        return 0;
       }
}
/*倒退着找一个空格位置,保证折叠处单词完整*/
int findblnk(int pos)
{
   while(pos>0&&line[pos]!=' ')
      --pos;    //退着找空格
   if(pos==0)         //行里没有空格?
      return MAXCOL;   
   else               
      return pos+1;   //空格符后面的下标位置
}
/*调整输入行,将把从位置pos开始
的字符复制到下一个输入行开始,
再返回变量pos的新值*/
int newpos(int 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、付费专栏及课程。

余额充值