您的位置:首页 > 编程语言 > C语言/C++

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

2016-05-13 15:13 453 查看
问题及代码:

/*把较长的行,折成二行或多行,
位置在第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;
}
}

运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: