1、这个程序刚开始交上去是runtime error,后来我把char型的三个数组初始化一下就AC了。
2、原因可能是我的编译器会给程序初始化而OJ上的不会,于是数组里读到了一些莫名其妙的东西(具体是什么我也猜不到)于是就越界了,所以初始化很重要。
3、scanf(“%s”)读入的时候并不会把后面用\0覆盖掉,应该是读到哪覆盖到哪,然后再后面给数组加个\0。
4、程序有一个小小的漏洞,如果所读句子在回车前最后一个字符是字母,则数组a不会被清空。好在所有数据都是标点符号结尾。
5、strcmp是两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止,所以至少要保证一个字符有\0结尾。如果都没有,而且前面字符都相同,我也不知道会发生什么。
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int m,n,i,ch,j;
char s[30][30]={""},a[30]="",sen[30][80]={""};
int p=0,count=0,sum[30]={0};
int main(void)
{
while(scanf("%d%d",&m,&n)==2)
{
int max=0;
count++;
for(i=0;i<m;i++)
scanf("%s",s[i]);
getchar();
for(i=0;i<n;i++)
{
int q=0;
fgets(sen[i],100,stdin);
while((ch=sen[i][q++])!='\n')
{
ch=tolower(ch);
if(!isalpha(ch))
{
for(j=0;j<m;j++)
if(strcmp(a,s[j])==0)
sum[i]++;
memset(a,'\0',sizeof(a));p=0;
}
else
a[p++]=ch;
}
}
for(j=0;j<n;j++)
if(max<sum[j]) max=sum[j];
printf("Excuse Set #%d\n",count);
for(j=0;j<n;j++)
if(sum[j]==max)
printf("%s",sen[j]);
printf("\n");
memset(sum,0,sizeof(sum));
memset(sen,'\0',sizeof(sen));
memset(s,'\0',sizeof(s));
}
return 0;
}