关闭

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

613人阅读 评论(0) 收藏 举报
分类:

MAXCOL=10,pos取值:

012345678901234567890123456789

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

#include <stdio.h>
#define MAXCOL 10
#define TABINC 8

char 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

  相关文章推荐
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:37071次
    • 积分:1019
    • 等级:
    • 排名:千里之外
    • 原创:68篇
    • 转载:0篇
    • 译文:0篇
    • 评论:11条
    最新评论