| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2039 人关注过本帖, 1 人收藏
标题:删除十个单词
取消只看楼主 加入收藏
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
结帖率:83.33%
收藏(1)
 问题点数:0 回复次数:8 
删除十个单词
函数readdat()实现从文件eng.in中读取一篇贡文文章存入到字符数组XX中;请编制函数delword()分别按行
删除空格,标点符号以及10个不区分大小写的英文单词,(you,for,your,on,no,if,the,in,to,all),余下
的单词按顺序重新存入数组XX中,最后调用函数writedat()把结果XX输出到文件ps6.out中。
例如:原文:you are a student.
      结果:areastudent
原始数据存入的格式是:每行的宽度均小于80个字符,含标点符号和空格。
文章中每行中的单词与单词之间用空格或其它标点符号分隔,每单词小于20个字符。

[[it] 本帖最后由 yqiong 于 2008-4-6 22:12 编辑 [/it]]
搜索更多相关主题的帖子: 单词 删除 
2008-03-31 17:20
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
收藏
得分:0 
读取函数如下:
int readdat()
{
      char xx[50][80],*p;
      int i=0;
      FILE *fp;
      if((fp=fopen("eng.in","r"))==NULL)return 1;
while(fgets(xx[i],80,fp)!=NULL)
 {
     p=strchr(xx[i],'\n');
     if(p)*p=0;
     i++;
 }
maxline=i;
 fclose(fp);
 return 0;
}

[[it] 本帖最后由 yqiong 于 2008-4-4 23:26 编辑 [/it]]
2008-03-31 17:21
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
收藏
得分:0 
怎么没人回答呀?
提供下delword()函数吧!谢谢了
2008-04-04 23:25
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
收藏
得分:0 
恩,我是写了下,但好像有问题呢
void delword(char *s)
{
    int i,j,k,p;
    for(i=0;i<maxline;i++)
    {
        for(j=0;j<strlen(xx[i]);j++)
            for(k=j,p=0;xx[i][j]==*(s+p);k++,p++)//用k记录xx[i][j]中字符位置,用p记录串s,
                //如果两者相等且s还没结束,则继续。
                if(*(s+p)=='\0')//当s到未尾时,说明xx[i]中存在单词s,并删除s
                {
                    for(k=j;k<strlen(xx[i])-strlen(s);k++)
                        xx[i][k]=xx[i][k+strlen(s)];
                       xx[i][k]='\0';
                }
    }
}
2008-04-05 19:56
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
收藏
得分:0 
上面这程序有误吗?帮忙看看啦
2008-04-06 19:13
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
收藏
得分:0 
#include <iostream>
#include <string>
#include <fstream>
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <malloc.h>
using namespace std;
char XX[50][80],YY[50][80];
int maxline,i;
int isDelword(char *word);
void processString (char * str);
int isToken(char c);
void processWord(char *bp,char *fp);
int readdat(char *s,char *t);


void main()
{
    int j;
    FILE *fp;
    readdat("in.txt","r");
    fp=fopen("out.txt","w");
    if(!fp)
    {printf("can't open the outfile");
    exit(1);
    }
    for(i=0;i<maxline;i++)
        processString(XX[i]);
    for(j=0;j<maxline;j++)
        printf("%s",XX[j]);
    for(j=0;j<maxline;j++)
        fprintf(fp,"%s",XX[j]);
    fclose(fp);
}


void processString (char * str){
char *fp, *bp;
fp = bp =str;
/**保证一开始bp,fp两个指针指向一个非分割字符(即一个字母字符)。*************/
while(*fp!=NULL && isToken(*fp)) fp++;
bp=fp;
/**这个while循环遍历整个字符串,用分割字符分割整个字符串,把它变成一个个单词。
然后有processWord(bp,fp)处理单词。
*************/
while(*fp!=NULL){
if (!isToken(*fp))
{fp++;continue;}
if(bp < fp) processWord(bp,fp);
/* 处理完从bp开始到fp结束的这个单词之后,再用这个while循环,保证bp和fp都指向下一个word的开始处,
即指向下一个字母字符位置。
*/
while(*fp!=NULL && isToken(*fp)) fp++;
bp = fp;
if (*fp==NULL) break;
else fp++;
}
/* 下面这个if语句不要省,不然最后一个单词可能不能输出:如"you are a student",注意这个字符串最后没有"."结尾
这样的话最后一个student没法输出。
*/
if(bp < fp) processWord(bp,fp);
}


/**取出指针从bp到fp的所有字符,存入一个临时数组空间,
判断是不是delword,是的化,不处理,否则存入XX数组中
*************/
void processWord(char *bp,char *fp){
char *word;
int k=0;
word = (char *)malloc(fp-bp+1);
while (bp<fp)
{word[k++] = *bp;
 bp++;
}
word[k]=0;
if (!isDelword(word)) strcat(YY[i],word);
free(word);
}



int isDelword(char *word){
/**该函数判断提取的单词是不是要删除的单词*************/
char *lword;
int i,flag=0;
lword = (char *)malloc(strlen(word)+1);
for (i=0;i<=strlen(word);i++)
lword[i] = tolower(word[i]);
if (strcmp(lword,"you")==0) flag=1;
if (strcmp(lword,"for")==0) flag=1;
if (strcmp(lword,"your")==0) flag=1;
if (strcmp(lword,"on")==0) flag=1;
if (strcmp(lword,"no")==0) flag=1;
if (strcmp(lword,"if")==0) flag=1;
if (strcmp(lword,"the")==0) flag=1;
if (strcmp(lword,"in")==0) flag=1;
if (strcmp(lword,"to")==0) flag=1;
if (strcmp(lword,"all")==0) flag=1;
free (lword);
return flag;
}

int isToken(char c){
/**该函数判断该字符是不是分割字符,即所有的非字母字符*************/
int flag = 0;
if (!isalpha(c)) flag = 1;
return flag;
}

int readdat(char *s,char *t)
{
      char *p;
      int j=0;
      FILE *fp;
      if((fp=fopen(s,t))==NULL)
      {printf("can't open the file");
      return 1;
      }
while(fgets(XX[j],80,fp)!=NULL)
 {
     p=strchr(XX[j],'\n');
     if(p)*p=0;
     j++;
 }
maxline=j;
 fclose(fp);
 return 0;
}

[[it] 本帖最后由 yqiong 于 2008-4-6 22:51 编辑 [/it]]
2008-04-06 22:08
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
收藏
得分:0 
上面代码直接复制到VC++中便可运行。编译连接没错误,但运行后out.txt文件中内容不对,多了一大串字符呢??????????


in.txt中内容如下:
I love the feeling in the university. It is full of youthful spirit. And I am deeply attracted by the scholarly atmosphere. And the most important, it’s my great honor to open my ears to your teaching.  Finally, I want to talk about a very practical problem. That is my dream of becoming a teacher in the university. I want to realize my dream and make myself to be a well-qualified person. I think the postgraduate studies can enrich my knowledge and make me competent in my future job.

[[it] 本帖最后由 yqiong 于 2008-4-6 22:42 编辑 [/it]]
2008-04-06 22:09
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
收藏
得分:0 
如果in.txt内容为:you are a student.
运行后输出:areastudentareastudent
不明白,为什么会输出两遍?

[[it] 本帖最后由 yqiong 于 2008-4-6 22:50 编辑 [/it]]
2008-04-06 22:46
yqiong
Rank: 1
等 级:新手上路
帖 子:315
专家分:0
注 册:2007-7-4
收藏
得分:0 
#include <iostream>
#include <string>
#include <fstream>
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <malloc.h>
using namespace std;
char XX[50][80],YY[50][80];
int maxline,i;
int isDelword(char *word);
void processString (char * str);
int isToken(char c);
void processWord(char *bp,char *fp);
int readdat(char *s,char *t);


void main()
{
    int j;
    FILE *fp;
    readdat("in.txt","r");
    fp=fopen("out.txt","w");
    if(!fp)
    {printf("can't open the outfile");
    exit(1);
    }
    for(i=0;i<maxline;i++)
        processString(XX[i]);
       for(j=0;j<maxline;j++)
        fprintf(fp,"%s\n",YY[j]);
    fclose(fp);
}
void processString (char * str){
char *fp, *bp;
fp = bp =str;
/**保证一开始bp,fp两个指针指向一个非分割字符。(以防第一个字符为非字母)*/
while(*fp!=NULL && isToken(*fp)) fp++;
bp=fp;
/*用while遍历整行,bp指向单词开始,fp向后遍历,一直到分隔符为止,即单词结束*/
while(*fp!=NULL){
if (!isToken(*fp))
{fp++;continue;}//还未遇到分割符,则fp继续向后遍历
if(bp < fp) processWord(bp,fp);//遇分割符且fp>bp则处理单词
/* 处理完从bp开始到fp结束的这个单词之后,再用这个while循环,保证bp和fp都指向下一个word的开始处,
即指向下一个字母字符位置。
*/
while(*fp!=NULL && isToken(*fp)) fp++;
bp = fp;
if (*fp==NULL) break;
//else fp++;这句好像有些多余,上面while语句中好像有这操作了
}
/* 下面这个if语句不要省,不然最后一个单词可能不能输出*/
if(bp < fp) processWord(bp,fp);//太周到了,要是我的话决不会考虑最后一个单词是以非分隔符结束的了:-(
}


void processWord(char *bp,char *fp){
char *word;
int k=0;
word = (char *)malloc(fp-bp+1);//高,一直以为这函数是开辟空间的, 原来还可以这样用来提取单词,绝^_^
while (bp<fp)
{word[k++] = *bp;
 bp++;
}
word[k]='\0';
if (!isDelword(word)) strcat(YY[i],word);
free(word);
}



int isDelword(char *word){
/**该函数判断提取的单词是不是要删除的单词*************/
char *lword;
int i,flag=0;
lword = (char *)malloc(strlen(word)+1);
for (i=0;i<=strlen(word);i++)
lword[i] = tolower(word[i]);
if (strcmp(lword,"you")==0) flag=1;
if (strcmp(lword,"for")==0) flag=1;
if (strcmp(lword,"your")==0) flag=1;
if (strcmp(lword,"on")==0) flag=1;
if (strcmp(lword,"no")==0) flag=1;
if (strcmp(lword,"if")==0) flag=1;
if (strcmp(lword,"the")==0) flag=1;
if (strcmp(lword,"in")==0) flag=1;
if (strcmp(lword,"to")==0) flag=1;
if (strcmp(lword,"all")==0) flag=1;
free (lword);
return flag;
}

int isToken(char c){
/**该函数判断该字符是不是分割字符,即所有的非字母字符*************/
int flag = 0;
if (!isalpha(c)) flag = 1;
return flag;
}

int readdat(char *s,char *t)
{
      char *p;
      int j=0;
      FILE *fp;
      if((fp=fopen(s,t))==NULL)
      {printf("can't open the file");
      return 1;
      }
while(fgets(XX[j],80,fp)!=NULL)
 {
     p=strchr(XX[j],'\n');
     if(p)*p=0;
     j++;
 }
maxline=j;
 fclose(fp);
 return 0;
}


改了下,但还是有些不对,输出时不是按行输出来的。
怎么回事呢?上一行的内容总是在下一行输出一部分
2008-04-07 14:38
快速回复:删除十个单词
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017123 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved