1、这道题不应该成为难题,但是没有清零导致反复WA,实在得不偿失。
2、sscanf在读不到东西时,不会将数组清零,而是保持原来的样子,所以比较好的做法是每次用sscanf之前先将所要写入的字符数组清零。
3、预处理是本程序的核心,先用fgets读取一行,再将a中“empty”的部分用'A'来代替。输出的时候再过滤。程序很长,但思路很简单。
#include <stdio.h>
#include <string.h>
int main(void)
{
char a[110]="",b[110]="",c[110]="",d[110]="",e[110]="",f[110]="",s[110]="";
int n,i;
scanf("%d",&n);getchar();
for(i=0;i<n;i++)
{
memset(a,'\0',sizeof(a));
memset(b,'\0',sizeof(b));
memset(c,'\0',sizeof(c));
memset(d,'\0',sizeof(d));
memset(e,'\0',sizeof(e));
memset(f,'\0',sizeof(f));
memset(s,'\0',sizeof(s));
int j=0,k=0;
fgets(a,100,stdin);
if(a[0]=='<')
{s[0]='A';s[1]='<';k+=2;j++;}
else {s[0]=a[0];k++;j++;}
while(a[j])
{
if(a[j]=='>'&&a[j-1]=='<')
{s[k++]='A';s[k++]='>';}
else if(a[j]=='<'&&a[j-1]=='>')
{s[k++]='A';s[k++]='<';}
else s[k++]=a[j];
j++;
}
if(a[strlen(a)-1]=='>')
s[k++]='A';
s[k]='\0';
memset(a,'\0',sizeof(a));
memset(b,'\0',sizeof(b));
memset(c,'\0',sizeof(c));
memset(d,'\0',sizeof(d));
memset(e,'\0',sizeof(e));
memset(f,'\0',sizeof(f));
sscanf(s,"%[^<]<%[^>]>%[^<]<%[^>]>%s",b,c,d,e,f);
if(b[0]!='A')
printf("%s",b);
if(c[0]!='A')
printf("%s",c);
if(d[0]!='A')
printf("%s",d);
if(e[0]!='A')
printf("%s",e);
if(f[0]!='A')
printf("%s",f);
printf("\n");
memset(b,'\0',sizeof(b));
fgets(a,100,stdin);
sscanf(a,"%[^...]",b);
if(b[0]!='A')
printf("%s",b);
if(e[0]!='A')
printf("%s",e);
if(d[0]!='A')
printf("%s",d);
if(c[0]!='A')
printf("%s",c);
if(f[0]!='A')
printf("%s",f);
printf("\n");
memset(s,'\0',sizeof(s));
}
return 0;
}