这是一道很好的基础题,它涵盖字符串的操作,排序和检索,题目的大意如下:首先给你一些忽略的单词,再给你一些title,在title中,除去忽略的单词,剩下的就全是关键字(keyword)了,例如,忽略词 'is','a','cool',一个title为 it is a pig but so cool,那么关键词就为‘it’,‘pig’,‘but’,‘so’。然后将所有关键字排序后输出:
我将此题分为输入,存储keyword,和排序输出三部分
1.输入
it is a pig BUT so cool
IT is a pig but so cool
it is a PIG but so cool
it is a pig but SO cool
输入忽略词我用scanf %d,用ignore[55][20]存储
输入title我用fgets或者gets,读取整行(基于输出整行考虑)
2.存储keyword
首先我构建一个keyword的结构体
struct keyword
{
char ch[20];
int title;
int lie1;
int lie2;
}key[10000];
考虑到keyword的排序输出,排序需要title和lie(1,2随便一个),lie1,lie2记录keyword所在title的位置,可以方便输出大写。
接下来只需要匹配忽略词存下keyword即可。
3.排序输出
排序我用sort(是c++的函数,包含在头文件algorithm,要用域名std),在用sort的时候,一直出现了一个异常invalid operator<,查看百度之后,方知在排序时,凡遇到两者相同当返回false。之前我想用qsort写了很久函数的排序都无法匹配,可能是我太水的缘故吧,所以改用比较简单的sort。
输出就将lie1,lie2区大写,其余小写就ok了。
代码如下:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#include<algorithm>
char scan[200][100];
char ignore[55][20];
struct keyword
{
char ch[20];
int title;
int lie1;
int lie2;
}key[10000];
int stringcmp(char * a,char * b)
{
int i,j;
char p1[20] ,p2[20];
for(i = 0; i < strlen(a); i++)
p1[i] = tolower(a[i]);
p1[i] = '\0';
for(i = 0; i < strlen(b); i++)
p2[i] = tolower(b[i]);
p2[i] = '\0';
return strcmp(p1,p2);
}
bool cmp(keyword a,keyword b)
{
if(stringcmp(a.ch,b.ch) < 0) return true;
else if(stringcmp(a.ch,b.ch) == 0)
{
if(a.title < b.title) return true;
else if(a.title == b.title)
if(a.lie1 < b.lie1) return true;
}
return false;
}
int main()
{
char a[200];
int line = -1,m = 0,n = -1;
while(scanf("%s",ignore[m++]))
{
if(!strcmp(ignore[m-1],"::")) break;
}
getchar();
m = m - 1;
while(fgets(scan[++line],100,stdin))
{
scan[line][strlen(scan[line]) - 1] = '\0';
int L = -1,k = 0;
do
{
if(scan[line][++L] == ' ' || scan[line][L] == '\0')
{
a[k] = '\0';
int i;
for(i = 0; i < m; i++)
if(!stringcmp(a,ignore[i])) break;
if(i == m)
{
strcpy(key[++n].ch,a);
key[n].lie1 = L - strlen(a);
key[n].lie2 = L - 1;
key[n].title = line;
}
k = 0;
}
else a[k++] = scan[line][L];
}while(scan[line][L] != '\0');
}
std::sort(key,key+n+1,cmp);
for(int i = 0; i <= n; i++)
{
int j = 0;
while(scan[key[i].title][j] != '\0')
{
if(j >= key[i].lie1 && j <= key[i].lie2) printf("%c",toupper(scan[key[i].title][j]));
else if(isalpha(scan[key[i].title][j])) printf("%c",tolower(scan[key[i].title][j]));
else printf("%c",scan[key[i].title][j]);
j++;
}
printf("\n");
}
getchar();
return 0;
}