C实现字符行排版

将字符行内单字之间的空白符平均分配插入到单字之间,以实现字符行排版。首先要统计字符行内单字个数,字符行内的空白字符数。然后计算单字之间 应该平均分配的空白字符数,另外约定多余的空白字符插在前面的单字间隔中前面的每个间隔多一个空白符,插完为止。

下面是我的代码的实现部分,这个字符行排版代码比较简答,其中的,实现统计单词个数的方法还是值得大家学习一下的。

#include <stdio.h>

#define N 80

/**
 * @brief main
 *  将字符行内单字之间的空白符平均分配插入到单字之间,
 *  以实现字符行排版。
 *
 *  首先要统计字符行内单字个数,字符行内的空白字符数。然后计算单字之间
 *  应该平均分配的空白字符数,另外约定多余的空白字符插在前面的单字间隔中
 *  前面的每个间隔多一个空白符,插完为止。
 * @return
 */

edit(char *s)
{
    int i,sp,w,inw,v,r;
    char buf[N],*str;

    for(inw=sp=w=i=0;s[i];i++)
    {
        if(s[i]==' ')
        {       /* 统计空白个数*/
            sp++;
            inw=0;  /* 置空白符状态*/
        }
        else if(!inw)
        {
            w++;    /* 统计单字个数*/
            inw=1;  /* 置单字状态*/
        }
    }

    if(w<=1)
        return; /* 单字数不超过1, 不排版 */

    v=sp/(w-1); /* 每个间隔平均空白符 */
    r=sp%(w-1); /* 多余的空白符 */

    strcpy(buf,s);

    for(str=buf;;)
    {
        while(*str==' ')str++; /* 掠过空白符 */
        for(;*str&&*str!=' ';) /* 复制单字 */
            *s++=*str++;
        if(--w==0)
            return;     /* 全部单字复制完毕,返回 */
        for(i=0;i<v;i++)
            *s++=' ';   /* 插入间隔空白符 */
        if(r)
        {
            *s++=' ';   /* 插入一个多余空白符 */
            r--;
        }
    }
}



int main()      /* 用于测试edit函数 */
{
    char buff[N];
    puts("This is a typeset program!\nPlease input a character line:\n");
    gets(buff);
    edit(buff);
    printf("\nThe character line after typeset is:\n\n%s\n",buff);
    puts("\n Press any key to quit...\n ");
    getch();

    return 0;
}

下面是我的程序的运行结果:

这里写图片描述

posted @ 2015-05-26 16:55  陈洪波  阅读(232)  评论(0编辑  收藏  举报