Уточнение программы проверки орфографии C

Возможный дубликат:
Сравнить два текста файлы - программа проверки орфографии на C

Я делаю программу проверки орфографии, и у меня есть работающий код, который действительно нуждается в доработке.

Проблема 1: я хочу только прочитать буквенно-цифровые символы в массиве wordcheck перед сравнением строк. Я хочу избавиться от всех специальных символов. Я думаю, что isalphnum был бы лучшим вариантом, но не уверен, как это реализовать.

Проблема 2: Программа работает очень медленно и тратит много памяти. Хотя я не знаю, как еще это сделать. Может ли кто-нибудь дать мне несколько советов? Я запутался в использовании бинарных функций, и я уверен, что должен это делать! Вот мой код:

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

int main(void)
{
/*Open files and test that they open*/
FILE *fp1;
FILE *fp2;
char fname[20];
char wordcheck[45];/*The longest word in the English Language is 45 letters long*/
char worddict[45];
char dummy;
int i;
int notfound;

fp1 = fopen("dictionary.txt","r");

if (fp1 == NULL)
{
printf("The dictionary file did not open.");
exit(0);
}

printf("Please enter the path of the file you wish to check:\n");
scanf("%s", fname);
scanf("%c", &dummy);

fp2 = fopen(fname, "r");
    if (fp2 == NULL)
        {
        printf("Your file did not open, please check your filepath and try again.\n");

        printf("Please enter path of file you wish to check: \n");
        scanf("%20s",fname);

        fp2 = fopen(fname, "r");
        }

    else
        {
        printf("Your file opened correctly\n");
        }

/*When files are open, read each word from the text file into an array:*/

    while(fscanf(fp2,"%s", wordcheck)!=EOF)//Reads word from text file into array//
    {

        for (i=0; wordcheck[i]; i++)
        {
            wordcheck[i] = tolower(wordcheck[i]);//makes all characters lower case//
        }
            fseek(fp1,0,SEEK_SET);

        /*printf("%s", wordcheck);//debugger*/

            while(fscanf(fp1,"%s", worddict)!=EOF)
            {   
                notfound = 1;

                if(strcmp(wordcheck, worddict)==0)//compare strings//
                {
                printf("This word: %s is in the dictionary\n", wordcheck);//debugger//
                notfound = 0;
                break;
                }
            }
            if(notfound == 1)
                {
                printf("%s is not in dictionary\n", wordcheck);
                }
    }
    printf("Your file has been checked. Please check any errors found");
    fclose(fp1);
    fclose(fp2);

return 0;
}

person adohertyd    schedule 20.12.2011    source источник
comment
Рекомендуемая литература: Проверка орфографии раньше была главным достижением программистов   -  person Sinan Ünür    schedule 21.12.2011
comment
Хорошая статья, но я все еще хочу использовать наилучший код для своей программы.   -  person adohertyd    schedule 21.12.2011
comment
Да, я видел 2 разных людей, всего 5 вопросов по этому поводу. Однозначно домашнее задание.   -  person jman    schedule 21.12.2011
comment
Не домашнее задание. Я изучаю C, и мне сказали, что это популярный вызов для начинающих программистов на C, поэтому я этим занимаюсь. Считай это домашним заданием, если хочешь, я не ищу ответа, мне нужна помощь, вот и все. Это дубликат последнего поста. Кто увидит это, если я обновлю его сейчас? Это неделя!   -  person adohertyd    schedule 21.12.2011
comment
Еще одна ошибка: stackoverflow.com/questions/8580222/   -  person jman    schedule 21.12.2011
comment
Это дубликат последнего поста. Кто увидит это, если я обновлю его сейчас? Не публикуйте дубликаты. КОГДА-ЛИБО. Если вы обновите свой старый пост, он снова будет поднят, чтобы люди могли его увидеть.   -  person Bart    schedule 21.12.2011
comment
Конечно, наймите умного китайского ребенка, чтобы он сделал это за вас!   -  person Thomas Eding    schedule 21.12.2011
comment
@ Барт, извини, я не знал, что сообщения были удалены! Раньше я обновлял старый пост и не видел, чтобы он поднимался вверх по списку, поэтому я так и предположил. В этом случае модераторы могут удалить это и принести извинения всем за неудобства!   -  person adohertyd    schedule 21.12.2011


Ответы (1)


Вы читаете словарь один раз для каждого входного слова! Если ваш входной файл длинный, сначала загрузите словарь в память, а затем проверьте каждое слово в файле. Если словарь длинный, вам может понадобиться сохранить его в хеш-таблице или trie. Но даже простой массив словарных слов должен улучшить время выполнения.

person lhf    schedule 20.12.2011