这道题还是有点麻烦的。如果把每个句子存为一个字符串,则在最后分离单词的时候会很麻烦。所以,我用一个结构体来作为一句话,把每句话中的单词单独储存,则最后处理的时候会方便很多。
#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; }