题目大意;给你N个ignore的词,M个title,要求你找出每个title中除了ignore的词外的所有词,并按升序排序,最后输出每个找到的单词的title,输出格式是,输出该单词所在的title,除了该单词是大写外,所有单词都是小写

解题思路:字符串处理,挺麻烦的,注意空格

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
#define maxn 55
#define maxm 210
#define maxd 10010
struct word{
	int start,end,mark;
	char str[maxd];
}w[maxd];

int cmp(const void *p1,const void *p2) {
	return strcmp((*(word*)p1).str,(*(word*)p2).str);
}

char key_word[maxn][15],title[maxm][maxd];
int main() {

	int cnt = 0,len,start,N = 0,count = 0;
	for( ; ; cnt++) {
		gets(key_word[cnt]);
		if(key_word[cnt][0] == ':' && key_word[cnt][1] == ':')
			break;
	}
	
	while(gets(title[count])) {

		len = strlen(title[count]);
		start = 0;

		for(int i = 0; i <= len; i++) {
			//遇到大写的就将其转换成小写的
			if(title[count][i] >= 'A' && title[count][i] <= 'Z') 
				title[count][i] = title[count][i] + 32;

			//如果title里面出现的空格,就判断是不是一个单词,如果是单词的话,就表示前一个字符不是空格
			if( (title[count][i] == ' '  || title[count][i] == '\0' ) && i - 1 >= 0) {
				if(title[count][i - 1] == ' ')
					break;

				int n = 0,mark = 1;
				for(int j = start; j < i; j++) {
					//判断前面是不是空格,如果是空格的话,就跳过
					if(title[count][j] == ' ')
						continue;
					//找到第一不是空格的字符,那个字符就是开端
					if(mark) {
						mark = 0;
						w[N].start = j;	
					}
					//之后的话将每个字符返回
					w[N].str[n] = title[count][j];
					n++;
				}
				w[N].str[n] = '\0';
				int j;
				//判断是不是要忽略的关键词
				
				for(j = 0; j < cnt; j++)
					if(strcmp(w[N].str,key_word[j]) == 0) 
						break;
					
				if(j == cnt) {
					w[N].end = i;
					w[N].mark = count;
					N++;
				}
				start = i;
			}
		}
		count++;
	}
	qsort(w,N,sizeof(w[0]),cmp);
	for(int i = 0; i < N; i++)  {
		int len = strlen(title[w[i].mark]);
		for(int j = 0; j < w[i].start; j++)
			printf("%c",title[w[i].mark][j]);
		for(int j = w[i].start; j < w[i].end; j++)
			printf("%c",title[w[i].mark][j] - 32);
		for(int j = w[i].end; j < len; j++)
			printf("%c",title[w[i].mark][j]);
		printf("\n");
	}
	
	return 0;
}