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

原创 2016年05月31日 21:24:17

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

把较长的输入行“折”成短一些的两行或多行

     源自《The C Programming Language》P25 pr1-22:     编写一个程序,把较长的输入行“折”成短一些的两行或多行,折行的位置在输入行的第n列之前的最后一个非...
  • roma823
  • roma823
  • 2011年04月25日 21:04
  • 2162

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

#include #define TABINC 4 #define MAXCOL 10 //指定输入行的折行位置 char line[MAXCOL]; /* 全局数组,在以下函数中都能...

练习1-23 编写一个删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符常量

最简单情形/* abc */只出现在注释中 #include #define MAXCHAR 10000 char line[MAXCHAR]; int pos; int detnote(in...

【C语言】验证花括号成对出现

题目要求 编写一个程序,它从标准输入(终端)读取C源代码,并验证所有的花括号都正确的成对出现。 注意:你不必担心注释内部、字符串常量内部和字符常量形式的花括号。 算法分析 我们先判断左花括号的数量是否...

自己搞,带注释,适合初学者:C程序设计语言练习1-22 把较长的输入行折成短一些的两行或多行,折行的位置在输入行的第n列之前的最后一个非空格之后

自己搞,带注释,适合初学者:C程序设计语言练习1-22 把较长的输入行折成短一些的两行或多行,折行的位置在输入行的第n列之前的最后一个非空格之后。要保证程序能够智能地处理输入行很长及在指定的列前没有空...
  • ycjnx
  • ycjnx
  • 2017年06月22日 14:38
  • 421

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

问题及代码: /*把较长的行,折成二行或多行, 位置在第n列前的最后一个非空格字符之后. 这个程序将把制表符扩展为空格,每遇到 一个换行符就把此前的输入文本打印出来, pos达到MAXCOL时折叠。*...

the c programing language 1-22 较长输入行折成短些的多行,非缓冲方式实现

/*  * K&R2 1-21  * Author: Donmmi  * Email:teddy_liu@live.com * 程序说明: 代码核心部分:折行后的当前行长度为未输出...

练习5-13 编写程序tail,将其输入中的最后n行打印出来。默认情况下,n的值为10,但可以通过一个可选参数改变n的值

若行数小于n,则全部打印,若行数大于n则打印最后n行,使用条件if(nlines=nlines-n)判断第i行是否打印。#include #include #include #define MA...

编写程序tail,将其输入中的最后n行打印出来。

默认情况下,n的值为10,可通过可选参数改变n的值,命令tail -n将打印其输入的最后n行。#include #include #include #define DEFLINS 10 #defi...

页面置换算法-FIFO——设置页框的大小为n个物理块,在输入一个内存块需求序列:如3 2 1 3 2 5 2 3 6 2 1 4 2之后,屏显每次页面调度结果,并屏显置换率。(队列实现版)

#include using namespace std; class QNode{  //链队结点的类         int  data;         QNode *next; pu...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:练习1-22 编写一个程序,把较长的输入行“折”成短一些的两行或多行,折行的位置在输入行的第n列之前的最后一个空格之后
举报原因:
原因补充:

(最多只允许输入30个字)