加拿大 签证查询 纸质:程序的漏洞,麻烦大师们帮补下(C程序)

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/16 22:41:49
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#define MAX 21
struct word * add(struct word * r,char * w,int line);
char * copy(char * w);
void tprint(struct word * r);
int getword(char * w);
struct word{
char * word;
int line[50];
int nline;
struct word * left;
struct word * right;
} * root;
char word[MAX];
char sign[]={'.',',','!','?',':',';'};
char * art[]={"a","an","and","the","A","An","And","The"};
int main ()
{
int c,i,j,line=1,key,key1,key2;
while(c!=EOF){
key=0;key1=1;key2=0;
c=getword(word);
for(i=0;word[i]!='\0';i++); /*字符传长度*/
for(j=i-2;j>=0;j--)/*检查除末字符外的其他字符*/
if(!isalpha(word[j])&&word[j]!='-'){
key1=0;break;
}
if(key1){
if(isalpha(word[--i]))
key2=1;
else{
for(j=0;j<6;j++)/*判断最后一个是否为有效符号*/
if(word[i]==sign[j]){
key2=1;
word[i]='\0';
break;
}
}
if(key2)/*检查该词是否为忽略词*/
for(j=0,key=1;j<8;j++)
if(!strcmp(word,art[j])){
key=0;break;
}
}
if(key)
root=add(root,word,line);
if(c=='\n')
line++;
}
tprint(root);
return 0;
}
struct word * add(struct word * r,char * w,int line)
{
int u;
if(r==NULL){
r=(struct word * )malloc(sizeof(struct word));
r->word=copy(w);
r->line[0]=line;
r->nline=1;
r->left=r->right=NULL;
}
else if((u=strcmp(r->word,w))>0)
r->left=add(r->left,w,line);
else if(u<0)
r->right=add(r->right,w,line);
else if(r->line[r->nline-1]!=line){
r->line[r->nline]=line;
r->nline++;
}
return r;
}
char * copy(char * w)
{
char * p;
p=(char *)malloc(strlen(w)+1);
strcpy(p,w);
return p;
}
void tprint(struct word * r)
{
int i;
if(r!=NULL){
tprint(r->left);
printf("%s:",r->word);
for(i=0;i<r->nline;i++)
printf(i==(r->nline-1)?"%d\n":"%d,",r->line[i]);
tprint(r->right);
}
}
int getword(char * w)
{
int c;
char * p=w;
while((c=getchar())!=' '&&c!='\n'&&c!=EOF)
*p++=c;
*p='\0';
return c;
}
还有这样一个测试点通不过:
Geneva, October 13, 2003 - Alcatel and HP today announced
they will jointly develop and market a suite of advanced
正确的结果应该是:
Alcatel:1
Geneva:1
HP:1
October:1
advanced:2
announced:1
develop:2
jointly:2
market:2
of:2
suite:2
they:2
today:1
will:2
错误原因:
"-"不是单词,
请帮助修复漏洞,谢谢!