练习1-22 编写一个程序,把较长的输入行“折”成短一些的两行或多行,折行的位置在输入行的第n列之前的最后一个空格之后

来源:互联网 发布:checking php support 编辑:程序博客网 时间:2024/05/21 06:41

MAXCOL=10,pos取值:

012345678901234567890123456789

main中else if(++pos>=MAXCOL)既赋值又判断。折行的位置在输入行的第n列之前的最后一个空格之后,若无空格则输出MAXCOL个字符。

#include <stdio.h>#define MAXCOL 10#define TABINC 8char line[MAXCOL];int exptab(int pos);int findblnk(int pos);int newpos(int pos);void printl(int pos);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);       }    }}/* 输出空格及其前字符 */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]=' ';  /* 8字符后制表符的特殊情形 */    for(++pos;(pos<MAXCOL) && (pos%TABINC!=0);++pos)        line[pos]=' ';    if(pos<MAXCOL)         return pos; /* 剩余8、9继续读取字符 */    else{        printl(pos);        return 0;    }}/* 确定输出位置 */int findblnk(int pos){    while(pos>0 && line[pos]!=' ')        --pos;    if(pos==0)        return MAXCOL;    else        return pos+1; /* 从后往前第一个空格后1字符位置 */}int newpos(int pos){    int i,j;    if(pos<=0 || pos>=MAXCOL)        return 0;    else{        i=0;        for(j=pos;j<MAXCOL;++j){ /* j自从后往前第一个空格后1字符位置开始 */            line[i]=line[j];            ++i;        }        return i;    }}
Created with Raphaël 2.1.0开始读取字符是否是制表符?使用空格替换,满10个则输出是否是换行符?输出是否读取了MAXCOL个字符判断输出位置、输出、补录空格后字符并重置pos是否读取结束?结束yesnoyesnoyesnoyesno
1 0