回 帖 发 新 帖 刷新版面

主题:重排空格功能代码求注释?

/* 字符排版函数,将字符行内单字之间的空白字符平均分配插入到单字之间*/
#define N 80
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--;
        }
    }
}
char buff[N];
main()        /* 用于测试edit函数 */
{
    clrscr();
    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();
}

这几行代码一直没看明白。请帮忙详细注明一下
        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--;
        }
    }
}

回复列表 (共2个回复)

沙发

说个前面循环的脉络,后面你自己看应该就能明白了
    for(inw=sp=w=i=0;s[i];i++)
    {
        if(s[i]==' ')
        {        /* 统计空白个数*/
            sp++;
            inw=0;    /* 置空白符状态*/
        }
        else if(!inw)
        {
            w++;    /* 统计单字个数*/
            inw=1;    /* 置单字状态*/
        }
    }
穷举字符串,如果读到空格就标记一下,然后在下一个字符处给单词数+1
最后统计出的w就是单词数了

板凳


/* 字符排版函数,将字符行内单字之间的空白字符平均分配插入到单字之间*/
#define N 80    /* 定义N为80 */
edit(char *s)  /* 指针指向全局变量字符串数组?会转指针的首地址还是字符串数组的字符? */  
{
    int i,sp,w,inw,v,r;
    char buf[N],*str;
    for(inw=sp=w=i=0;s[i];i++) 
/* for(循环变量初始化;循环控制条件;变量操作),当s[i]=0时跳出循环,C语主规定字符串数组以0结束,没填满的字符数组是不是也为0? */
 {
        if(s[i]==' ')    // 如果是空格为真,运行大括号,else if不被运行
        {                /* 统计空白个数*/
            sp++;
            inw=0;       /* 置空白符状态*/
        }
        else if(!inw)      //当上面的if为假时,如果只有inw是0时才为真,运行大括号
        {
            w++;          /* 统计单字个数*/
            inw=1;        /* 置单字状态*/
        }
    }
    if(w<=1)
        return;            /* 单字数不超过1, 不排版,跳出返回没返回值 */
    v=sp/(w-1);            /* 每个间隔平均空白符,int型除法,商为整数值 */
    r=sp%(w-1);            /* 多余的空白符,int求余,为整数值 */
    strcpy(buf,s);      /* 复制等值字符串数组s到字符数组buf中,无须开头包含string.h文件? */
    for(str=buf;;)         /* str指针指向buf数组 无限循环大括号 */
    {
        while(*str==' ')str++; 
/* 先判断指针所指字符是否为空格,如果不是退出循环,如果是指针向数组下一字符,继续循环,目的只留一个空格*/
        for(;*str&&*str!=' ';) 
/* 判断*str是否为0,为0不进行与操作,如果不为0,判断*str是否不为空格,不是空格1,是空格为0,然后*str和判断结果进行与操作,结果为1循环,为0退出,用*str与的作用是?  目的复制字符是空格时插入空格 */
            *s++=*str++;    /* 把*str赋回给*s,以便返回输出 */
        if(--w==0)
            return;        /* 全部单字复制完毕,返回主函数 */
        for(i=0;i<v;i++)
            *s++=' ';      /* 插入间隔空白符 */
        if(r)              /* 判断不为0,运行大括号 */
        {
            *s++=' ';      /* 插入一个多余空白符 */
            r--;
        }
    }
}
char buff[N];               /* 全局变量 */
main()                      /* 用于测试edit函数 */
{
    clrscr();               /* 清屏,这个也不用包括conio.h头文件? */
    puts("This is a typeset program!\nPlease input a character line:\n");
    gets(buff);             /*这个也不用包括stdio.h头文件? */
    edit(buff);
    printf("\nThe character line after typeset is:\n\n%s\n",buff);
    puts("\n Press any key to quit...\n ");
    getch();                /*输入一字符,不回显,这个也不用包括conio.h头文件? */ 
}

本人这样注释帮忙看看对不?还有一些疑问也在?大虾帮帮忙的啊

我来回复

您尚未登录,请登录后再回复。点此登录或注册