这道题还是有点麻烦的。如果把每个句子存为一个字符串,则在最后分离单词的时候会很麻烦。所以,我用一个结构体来作为一句话,把每句话中的单词单独储存,则最后处理的时候会方便很多。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct ss {
int x, y;
char word[20][50];
char key[50];
}stmp[250], s[250];
char ig[55][15]; // 被忽略的词
int ign = 0, sn = 0; // 被忽略词数量和title数量
// 将字符串大写转小写
void UTL(char str[]) {
int len = strlen(str);
for (int i=0; i<len; i++)
if (str[i]>='A' && str[i] <= 'Z') {
str[i] += ('a'-'A');
}
}
// 将字符串小写转大写
void LTU(char str[]) {
int len = strlen(str);
for (int i=0; i<len; i++)
if (str[i]>='a' && str[i] <= 'z') {
str[i] += ('A'-'a');
}
}
// 判断是否为被忽略词
bool judge(char str[]) {
for (int i=0; i<ign; i++) {
if (0 == strcmp(str, ig[i]))
return false;
}
return true;
}
// 快排比较函数,如果两个字符串相等,就比较它们的优先级
int cmp(const void *_a, const void *_b) {
struct ss *a = (struct ss*)_a;
struct ss *b = (struct ss*)_b;
if (strcmp(a->key, b->key) != 0)
return strcmp(a->key, b->key);
return a->x - b->x;
}
int main() {
// 下面两个while 用于输入操作
while (scanf("%s", ig[ign])) {
if (':' == ig[ign][0])
break;
ign++;
}
getchar();
char str[50];
while (scanf("%s", str) != EOF) {
char ch = getchar();
// 先将每个单词转为小写
UTL(str);
strcpy(stmp[sn].word[stmp[sn].y], str);
stmp[sn].y++; // 记录每句话单词的个数
if ('\n' == ch) {
stmp[sn].x = sn; // 记录每句话的优先级
sn++;
}
}
// 下面对每句话的每个单词进行处理
int num = 0;
for (int i=0; i<sn; i++) {
for (int j=0; j<stmp[i].y; j++) { // 现在对每个单词进行处理
if (judge(stmp[i].word[j])) {
s[num] = stmp[i];
LTU(s[num].word[j]);
strcpy(s[num].key, s[num].word[j]);
num++;
}
}
}
// 排序并输出
qsort(s, num, sizeof (s[0]), cmp);
for (int i=0; i<num; i++) {
int j;
for (j=0; j<s[i].y-1; j++)
printf("%s ", s[i].word[j]);
printf("%s\n", s[i].word[j]);
}
return 0;
}