<span style="font-size:18px;">对于本题我采用获取关键字,获取句子,然后进行比较,查找句子中关键字数的最大值进行完成。</span>
<span style="font-size:18px;">获取句子时采用getchar() 来完成,比较时采用isalpha来判断单词后符号,进行计数加减。结果提交出现Runtime Error,以下是错误代码:</span>
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
#define MAX 110
char word[MAX][MAX],line[MAX][MAX];
char lower_word[MAX][MAX],lower_line[MAX][MAX];
int p,is_count[MAX];
void get_word(int m)
{
memset(word,'\0',sizeof(word));
memset(lower_word,'\0',sizeof(lower_word));
int i,j;
for(i=0;i<m;i++)
{
cin>>word[i];
}
for(i=0;i<m;i++)
{
for(j=0;word[i][j]!='\0';j++)
{
lower_word[i][j]=tolower(word[i][j]);
}
}
}
void get_line(int n)
{
int i,j;
j=n;
char c,ch;
memset(line,'\0',sizeof(line));
memset(lower_line,'\0',sizeof(lower_line));
c=getchar();
while(n--)
{
i=0;
while((ch=getchar())!='\n')
{
line[n][i]=ch;
lower_line[n][i]=tolower(ch);
i++;
}
}
}
int is_find(int n)
{
int i,is_max;
is_max=is_count[0];
for(i=0;i<n;i++)
{
if(is_count[i]>is_max)
{
is_max=is_count[i];
}
}
for(i=n-1;i>=0;i--)
{
if(is_count[i]==is_max)
{
cout<<line[i]<<endl;
}
}
return 0;
}
int cmp_string(int m,int n)
{
int i,j,k,x;
memset(is_count,0,sizeof(is_count));
for(k=0;k<n;k++)
{
for(j=0;lower_line[k][j]!='\0';j++)
{
int y=j;
for(i=0;i<m;i++)
{
x=0;
while((lower_word[i][x]==lower_line[k][y])&&(lower_line[k][y]!='\0'))
{
x++;
y++;
}
if(lower_word[i][x]=='\0'&&(!isalpha(lower_line[k][y])))
{
is_count[k]++;
i=-1;
j=y;
}
else
{
y=j;
}
}
}
}
}
int main()
{
int m,n,i,j,number=0,is_count[MAX];
while(cin>>m)
{
cin>>n;
get_word(m);
get_line(n);
cmp_string(m,n);
number++;
cout<<"Excuse Set #"<<number<<'\n';
is_find(n);
cout<<endl;
}
return 0;
}
之后通过搜索发现出现Runtime Error的原因一般是输入的问题,检测数组溢出等,因此重换了一种输入句子的写法,即采用cin.getline方法,结果AC了,以下是AC后代码:
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
#define MAX 101
char word[MAX][MAX],line[MAX][MAX];
char lower_word[MAX][MAX],lower_line[MAX][MAX];
int p,is_count[MAX];
void get_word(int m)
{
memset(word,'\0',sizeof(word));
memset(lower_word,'\0',sizeof(lower_word));
int i,j;
for(i=0;i<m;i++)
{
cin>>word[i];
}
for(i=0;i<m;i++)
{
for(j=0;word[i][j]!='\0';j++)
{
lower_word[i][j]=tolower(word[i][j]);
}
}
}
void get_line(int n)
{
int i,j;
j=n;
char ch;
memset(line,'\0',sizeof(line));
memset(lower_line,'\0',sizeof(lower_line));
getchar();
while(n--)
{
cin.getline(line[n],100,'\n');
int str;
str=strlen(line[n]);
for(i=0;i<str;i++)
{
lower_line[n][i]=tolower(line[n][i]);
}
}
}
int is_find(int n)
{
int i,is_max;
is_max=is_count[0];
for(i=0;i<n;i++)
{
if(is_count[i]>is_max)
{
is_max=is_count[i];
}
}
for(i=n-1;i>=0;i--)
{
if(is_count[i]==is_max)
{
puts(line[i]);
}
}
return 0;
}
int cmp_string(int m,int n)
{
int i,j,k,x;
memset(is_count,0,sizeof(is_count));
for(k=0;k<n;k++)
{
for(j=0;lower_line[k][j]!='\0';j++)
{
int y=j;
for(i=0;i<m;i++)
{
x=0;
while((lower_word[i][x]==lower_line[k][y])&&(lower_line[k][y]!='\0'))
{
x++;
y++;
}
if(lower_word[i][x]=='\0'&&(!isalpha(lower_line[k][y])))
{
is_count[k]++;
i=-1;
j=y;
}
else
{
y=j;
}
}
}
}
}
int main()
{
int m,n,i,j,number=0,is_count[MAX];
while(scanf("%d %d",&m,&n)!=EOF)
{
get_word(m);
get_line(n);
cmp_string(m,n);
number++;
cout<<"Excuse Set #"<<number<<'\n';
is_find(n);
cout<<endl;
}
return 0;
}
另外测试代码运行时间可用如下代码测试:
#include <ctime> //计时用的头文件
#include <iostream>
using namespace std;
void main()
{
clock_t start,end; /*注意计时所用的变量名称*/
/*程序开始执行,开始计时*/
start=clock(); //获得开始的时间,单位为毫秒
/*这里插入你写的代码,如果运行速度比较快的话,就用循环语句循环N遍*/
end=clock(); //获得结束时间
double time=(double)(end - start);//这里的时间是计算机内部时间 目前单位应该是毫秒
cout<<"endTime - beginTime = Time"<<endl;
cout << end <<" - "<<start<<" = "<<time<< endl;
system("pause");
}