#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;
}
改了下,但还是有些不对,输出时不是按行输出来的。
怎么回事呢?上一行的内容总是在下一行输出一部分
#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;
}
改了下,但还是有些不对,输出时不是按行输出来的。
怎么回事呢?上一行的内容总是在下一行输出一部分