scanf输入后那个回车被gets(str)接收了,所以下次遇到gets就不再等待你输入,可以用getchar()把scanf输入后的回车接收就好了。 我运行过的,给最佳答案哦!
!!!!!!就是for中用到gets时 前面如果有scanf过 要char ch=getchar()把scanf的回车符回收 不然运行出错的
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
#define SIZE 30
struct node
{
char str[SIZE];//字符串内容
int row;//输入时的行号
int ok;//匹配是否成功 1成功 0未成功
}P[1000];
//暴力解。。。很麻烦 因为编写时误解题意 模式匹配必须是长度也相同的全部匹配 而不是包含关系的匹配
void check(node P[1000],char match[SIZE],int n)
{
int v=strlen(match);//匹配字符串的长度
int i,j;
for(i=0;i<n;i++)
{
int k=0;
int mark=0;//表示是否进入[]内匹配
int len=strlen(P[i].str);
for(j=0;j<len;j++)
{
if(match[k]=='[')
{
int flag1=j;
j++;
mark=1;
}
while(mark==0&&tolower(P[i].str[j])==tolower(match[k]))//表示不在[]内匹配
{
j++;
k++;
}
if(match[k]!='[')
{
P[i].ok=0;//匹配失败
break;
// k=0;//重新匹配 模式匹配是全部都要匹配 不是部分匹配 也就是长度也要一样的
// continue;
}
else if(match[k]=='[')
{
k++;
mark=1;
// int u;
// for(u=k;u<strlen(march);u++)
// {
while(tolower(P[i].str[j])!=tolower(match[k])&&mark==1)//在[]内匹配
{
if(match[k]==']')//遇到]表示不在[]内匹配了 mark变为0
mark=0;
k++;
}
if(mark==1)//表示在[]内匹配成功了 mark=1是在[]内
{
while(match[k]!=']')//k指向']'的位置
k++;
k++;
j++;
mark=0;//表示不在[]内匹配
int pass=1;//pass用于控制是否继续进行匹配 初始为1 因为在[]内匹配成功了
while(mark==0&&tolower(P[i].str[j])==tolower(match[k])&&pass==1)
{
if(k<v)//v是match的长度 只有字符下标小于v时才能进行匹配
{
j++;
k++;
}
else//否则不进行匹配 匹配失败
{
pass=0;
P[i].ok=1;
}
}
if(k<v)//若未匹配完全 则匹配失败
{
P[i].ok=0;
break;
// k=0;//重新匹配
// continue;
}
}
else if(mark==0)//若在[]内未找到匹配 则匹配失败
{
P[i].ok=0;
break;
// k=0;
// continue;
}
// }
}
}
}
// printf("check...\n");
// printf("match=%s\n",match);
for(i=0;i<n;i++)
{
if(P[i].ok==1)
printf("%d %s\n",P[i].row,P[i].str);
}
}
int main()
{
// FILE *fp_in,*fp_out;
// fp_in=fopen("string.in","r");
// fp_out=fopen("string.out","w");
// char str[1000][30];
int i,n;
char match[SIZE];//匹配字符串
while(scanf("%d",&n)!=EOF)
{
char ch=getchar();//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!scanf输入后那个回车被gets(str)接收了,所以下次遇到gets就不再等待你输入,可以用getchar()把scanf输入后的回车接收就好了。 我运行过的,给最佳答案哦!
for(i=0;i<n;i++)
{
gets(P[i].str);
// // printf("str=%s\n",P[i].str);
P[i].row=i+1;
// // printf(" row=%s\n",P[i].row);
}
gets(match);
// printf("main match=%s\n",match);
check(P,match,n);
}
return 0;
}