C语言---单词检查

时间:2022-09-09 19:56:56

已知有一个正确单词索引表(保存在当前目录下的文件index.txt中,且全为小写字母,按照字典序由小到大排列,每个单词独占一行),编写程序利用该单词表对某一英文文章(保存在当前目录下的另一个文件in.txt中)进行单词正确性检查,若该英文文章中出现的单词(只有连续字母组成)没有出现在单词索引文件中(检查时大小写无关),则将该出错的单词(其中的字母全部转换为小写)输出到当前目录下的另一文件error.txt中,每个单词独占一行,并且以字典序由小到大的顺序输出。
假设:
1、in.txt中的文章有可能没有经过排版,格式有可能杂乱无章,也有可能没有写完整。
2、index.txt中的单词个数不超过1000个,每个单词的长度不超过50个字母。
3、若出错的单词多次出现,则多次输出。

【输入形式】

保存单词索引表的文件index.txt和保存英文文章的文件in.txt都位于当前目录下。

【输出形式】

将出错的单词以字典序由小到大的顺序输出到当前目录下的文件error.txt中,每个单词单独占一行,多次出错的单词多次输出。若没有出现错误单词,则什么也不输出。

【样例输入1】

假设文件in.txt内容为:

There are two verrsions of the international standards for C.
Thee first version was ratified in 1989 by the American National
Standards Institue (ANS1) C standard committee.It is often
referred as ANS1 C or C89. The secand C standard was completed
in 1999. This standard is comonly referred to as C99. C99 is a
milestone in C’s evolution into a viable programing languga
for numerical and scientific computing.

文件index.txt中的单词索引表内容为:

a
american
and
ansi
are
as
by
c
committee
commonly
completed
computing
evolution
first
for
in
institue
international
into
is
it
language
milestone
national
numerical
of
often
or
programming
ratified
referred
s
scientific
secand
standard
standards
the
there
this
to
two
version
versions
viable
was

【样例输出1】

文件error.txt中出错的单词应为:

ans
ans
comonly
languga
programing
thee
verrsions

【样例1说明】

用index.txt中的单词索引表对in.txt中出现的每一个单词进行检查,检查时大小写无关,所以第一个单词There出现在索引表中,不是错误单词;单词verrsions没有出现在索引表中,拼写错误,所以作为出错单词输出;单词ANSI拼写成了ANS1,将其中字母都转换为小写后输出,并且多次出现,多次输出;其他出错单词类似。错误单词输出按照字典序由小到大输出到error.txt文件中。

【样例输入2】

假设文件in.txt内容为:

There are two versions of the international standard fo

文件index.txt中的单词索引表内容为:

are
for
international
of
standards
the
there
two
versions

【样例输出2】

文件error.txt中出错的单词应为:

fo
standard

【样例2说明】

文件in.txt中的单词standard没有出现在索引表文件index.txt中,所以作为错误单词输出。
注意:样例2中in.txt文件内容还不完整,最后的单词fo后没有任何字符,fo也没有出现在索引表中,所以也作为错误单词输出。

【评分标准】本题要求对文章的单词进行检查,提交程序文件名为words.c或words.cpp。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
    FILE *f, *g,*h;
    char word[20], c, tmp[20];
    char words[100][20],tr[100][20],err[100][20];
    int i, j = 0, k = 0,m=0;
    f = fopen("in.txt", "r");
    h = fopen("index.txt", "r");
    g = fopen("error.txt", "w");
    while (!feof(f)) {
        fscanf(f, "%s", words[k++]);
    }
    rewind(f);
    while (!feof(h)) {
        fscanf(h, "%s", tr[m++]);
    }
    rewind(h);

    for (i = 0; i < k; i++) {
        for (j = 0; j < strlen(words[i]); j++) {
            c = words[i][j];
            if ((c <= 'z'&&c >= 'a') || (c <= 'Z'&&c >= 'A')) {
                if ((c <= 'Z'&&c >= 'A')) {
                    c += 32;
                }
                words[i][j] = c;
            }
            else if (c == '\'') {
                int a = j, t = 0;
                while (words[i][a++] != ' ') {
                    words[k][t++] = words[i][a];
                }
                k++; 

            }
            else {

                words[i][j] = '\0';
            }
        }
    }
    int flag = 0,tp=0;
    for (i = 0; i < k; i++) {
        if ((words[i][0] == '\0')) {
            continue;
        }
        for (j = 0; j < m; j++) {
            if (strcmp(words[i], tr[j]) == 0) {
                flag = 1;
            }
        }
        if (!flag) {
            strcpy(err[tp++] , words[i]);
        }
        flag = 0;

    }
    for (i = 0; i < tp; i++) {
        for (j = i + 1; j < tp; j++) {
            if (strcmp(err[i], err[j]) > 0) {
                strcpy(word, err[i]);
                strcpy(err[i], err[j]);
                strcpy(err[j], word);
            }
        }
        fprintf(g, "%s\n", err[i]);
    }
    fclose(f);
    fclose(g);
    fclose(h);
    return 0;
}