首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

字符删除的有关问题

2012-02-03 
字符删除的问题现有一英文文章已经按行读去到数组xx[50][80]中变量maxline记录了文章的行数文章的格式如下

字符删除的问题
现有一英文文章
已经按行读去到数组xx[50][80]中
变量maxline记录了文章的行数
文章的格式如下:
文章只有单词,空格和标点符号组成,每个单词长度不超过20,每行不超过80个字符
现要求删除文章的空格和标点及长度为奇数的单词,其余的仍然按行存储


以下是删除的函数   Delword()
不知道那里出问题了   ,系统提示删除后的文件不正确
void   DelWord(void)
{   char   newxx[80]= " ",word[20]= " ";
    int   i,j=0,wl=0;
    for(i=0;i <maxline;i++)
        {   while(xx[i][j]!=0)
{   if(isalpha(xx[i][j]))word[wl++]=xx[i][j];
    else
        {   if(wl%2==0)strcat(newxx,word);
            for(wl=0;wl <strlen(word);wl++)word[wl]=0;
            wl=0;
        }
        j++;
}
if(isalpha(xx[i][--j]))
    {   if(wl%2==0)strcat(newxx,word);
        for(wl=0;wl <strlen(word);wl++)word[wl]=0;
        wl=0;
    }
strcpy(xx[i],newxx);
for(wl=0;wl <80;wl++)newxx[wl]=0;
wl=0;
        }
}
----以下是全部代码,但除了   delword函数,其他的函数肯定正确
只要知道maxline记录了行数,xx[50][80]是全局数组即可
#include   <stdio.h>
#include   <string.h>
#include   <conio.h>
#include   <ctype.h>

char   xx[50][80]   ;
int   maxline   =   0   ;     /*   文章的总行数   */

int   ReadDat(void)   ;
void   WriteDat(void)   ;

void   DelWord(void)
{   char   newxx[80]= " ",word[20]= " ";
    int   i,j=0,wl=0;
    for(i=0;i <maxline;i++)
        {   while(xx[i][j]!=0)
{   if(isalpha(xx[i][j]))word[wl++]=xx[i][j];
    else
        {   if(wl%2==0)strcat(newxx,word);
            for(wl=0;wl <strlen(word);wl++)word[wl]=0;
            wl=0;
        }
        j++;
}
if(isalpha(xx[i][--j]))
    {   if(wl%2==0)strcat(newxx,word);
        for(wl=0;wl <strlen(word);wl++)word[wl]=0;
        wl=0;
    }
strcpy(xx[i],newxx);
for(wl=0;wl <80;wl++)newxx[wl]=0;
wl=0;
        }


}

void   main()
{
    clrscr()   ;
    if(ReadDat())   {
        printf( "数据文件ENG.IN不能打开!\n\007 ")   ;
        return   ;
    }
    DelWord()   ;
    WriteDat()   ;
}

int   ReadDat(void)
{
    FILE   *fp   ;
    int   i   =   0   ;
    char   *p   ;

    if((fp   =   fopen( "eng.in ",   "r "))   ==   NULL)   return   1   ;
    while(fgets(xx[i],   80,   fp)   !=   NULL)   {
        p   =   strchr(xx[i],   '\n ')   ;
        if(p)   xx[i][p   -   xx[i]]   =   0   ;
        i++   ;
    }


    maxline   =   i   ;
    fclose(fp)   ;
    return   0   ;
}

void   WriteDat(void)
{
    FILE   *fp   ;
    int   i   ;

    fp   =   fopen( "ps8.out ",   "w ")   ;
    for(i   =   0   ;   i   <   maxline   ;   i++)   {
        printf( "%s\n ",   xx[i])   ;
        fprintf(fp,   "%s\n ",   xx[i])   ;
    }
    fclose(fp)   ;
}




[解决办法]
if(isalpha(xx[i][--j]))
{
if(wl%2==0)strcat(newxx,word);
for(wl=0;wl <strlen(word);wl++)word[wl]=0;
wl=0;
}

这部分是干什么用的?
看着多余 ......

while 的退出条件是字符串结束,
并且wl在前一轮循环中被赋值为0,
那么必然有 wl%2==0,
那么如果 这一行的最后一个单词是 a (一个字符,长度为奇数),
在你的这个过程中, 是否也被链接上去了?

感觉这个部分就是一块鸡肋!
[解决办法]
其实是不多余的,你想想,如果这一行的格式是这样的:i was jack\0
那么就会因为遇到\0而结束循环,这时数组word其实还存有jack这个单词未处理呢
而\0 之前是不是一个字母所以用if(isalpha(xx[i][--j]))判断
--------------------------------
是不是外面while循环判断的时候用\0套一个,把你那段删了

热点排行