Словарь соответствия / программа проверки орфографии - PullRequest
1 голос
/ 08 января 2010

Пожалуйста, помогите мне с программой проверки орфографии на C. Большая часть кодирования завершена (я думаю ...). Я действительно застрял, потому что я не уверен, почему программа не будет компилироваться. По общему признанию, я все еще начинающий программист, не могли бы вы дать несколько советов по поводу некоторых плохих привычек кодирования, которые у меня есть в коде? Спасибо!

Сообщение об ошибке:

1>------ Build started: Project: project7, Configuration: Debug Win32 ------
1>Compiling...
1>project7.c
1>c:\users\x309\documents\visual studio 2008\projects\project7\project7\project7.c(16) : warning C4101: 'dictionaryWord' : unreferenced local variable
1>c:\users\x309\documents\visual studio 2008\projects\project7\project7\project7.c(77) : warning C4029: declared formal parameter list different from definition
1>c:\users\x309\documents\visual studio 2008\projects\project7\project7\project7.c(91) : warning C4013: 'strlen' undefined; assuming extern returning int
1>c:\users\x309\documents\visual studio 2008\projects\project7\project7\project7.c(96) : warning C4013: 'strncmp' undefined; assuming extern returning int
1>c:\users\x309\documents\visual studio 2008\projects\project7\project7\project7.c(101) : warning C4013: 'printf' undefined; assuming extern returning int
1>c:\users\x309\documents\visual studio 2008\projects\project7\project7\project7.c(78) : warning C4101: 'i' : unreferenced local variable
1>Linking...
1>project7.obj : error LNK2019: unresolved external symbol _artLength referenced in function _spellCheck
1>C:\Users\x309\Documents\Visual Studio 2008\Projects\project7\Debug\project7.exe : fatal error LNK1120: 1 unresolved externals
1>Build log was saved at "file://c:\Users\x309\Documents\Visual Studio 2008\Projects\project7\project7\Debug\BuildLog.htm"
1>project7 - 2 error(s), 6 warning(s)

Что требуется ... В этом проекте есть только один этап - написание процедуры spellCheck. Функция spellCheck имеет два параметра. Первый параметр (article []) - это указатель на массив символов. Содержимое этого массива является статьей, которую нужно проверить правописанием. Конец статьи помечен нормальным 0 (отмечая конец строки). Статья содержит знаки препинания, прописные и строчные буквы, цифры и сокращения. Ваша функция должна печатать каждое слово в статье, которое не может быть найдено в словаре. Словарь является вторым параметром функции (подробнее об этом позже).

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

char dictionary[1000000];
char article[100000];

void spellCheck(char[], char[]);
int isLetter(char c);
void removePunc(char article[]);
void toLower( char article[]);
void lowerDictionary( char dictionary[]);
int artLength( char article[]);
void nextArticleWord(char article[], char articleWord[],  int artLength, char dictionary[]);

int main(void) {
    FILE* dict_file;
    FILE* article_file;
    int bytes_read;
    char* p;

    dict_file = fopen("american-english.txt", "r");
    if (dict_file == 0) {
        printf("unable to open dictionary file \"american-english.txt\"\n");
        return -1;
    }

    article_file = fopen("article.txt", "r");
    if (article_file == 0) {
        printf("unable to open file \"article.txt\"\n");
        return -1;
    }

    /* read dictionary */
    p = dictionary;
    p = fgets(p, 100, dict_file);
    while (p != 0) {
        while (*p != '\0') { 
            p += 1; 
        }
        p = fgets(p, 100, dict_file);
    }

    /* read article */
    p = article;
    bytes_read = fread(p, 1, 1000, article_file);
    p += bytes_read;
    while (bytes_read != 0) {
        bytes_read = fread(p, 1, 1000, article_file);
        p += bytes_read;
    }
    *p = 0;

    spellCheck(article, dictionary);
}   



int articlePosition =0;
int dictionaryPosition = 0;




void spellCheck(char article[], char dictionary[]) {
    char articleWord[50]; 
    char dictionaryWord[50];
    int articleLength = artLength(article);
    removePunc(article);
    toLower(article);
    lowerDictionary(dictionary);
    nextArticleWord(article, articleWord, articleLength, dictionary);

}

void nextDictionaryWord(char dictionary[], char dictionaryWord[]){
    int i;
    for(i =0; dictionary[dictionaryPosition] != '\n'; i++){
        dictionaryWord[i] = dictionary[dictionaryPosition];
        dictionaryPosition++;
    }
}
int isLetter(char c){
    if ( (c>='a'&&c<='z') || (c>='A'&&c<='Z'))
        return 1;
    return 0;
}

void removePunc(char article[]){
    int i, j=0;
    for ( i =0; article[i] != 0; i++){
        if (isLetter(article[i])){
            article[j] = article[i];
            j++;
        }
        else if (!isLetter(article[i])){
            article[j] = ' ';
            j++;
        }       
    }
}

void toLower( char article[]){
    int i=0;
    for( i; article[i] != 0; i++){
        if ( article[i] >= 'A' && article[i] <='Z')
            article[i] = article[i] + 32;
    }
}

void lowerDictionary( char dictionary[]){
    int i=0;
    for(i; dictionary[i] != 0; i++){
        if (dictionary[i] >= 'A' && dictionary[i] <= 'Z'){
            dictionary[i] = dictionary[i] + 32;
        }
    }
}


int articleLength( char article[] ){
    int count=0;
    while (article[count] != 0)
        count++;
    return count;
}

void nextArticleWord(char article[], char articleWord[],  int articleLength, char dictionaryWord[], char dictionary[]){
    int j, i;
check:
    while(!isLetter(article[articlePosition])){
        if (article[articlePosition] == 0){
            return;
        }
        articlePosition++;
    }
    for(j=0; article[articlePosition] != ' ' || articlePosition == articleLength; j++){
        articleWord[j] = article[articlePosition];
        articlePosition++;
    }   

    if (strlen(articleWord)<2){
        goto check;
    }
    articleWord[j+1] = 0;
    //dictionary search
        while (!strncmp(articleWord, dictionaryWord,strlen(articleWord))){
            nextDictionaryWord(dictionary, dictionaryWord);
        }
        if(strncmp(articleWord, dictionaryWord,strlen(articleWord)))
            return;
        printf(articleWord);
}

Ответы [ 4 ]

1 голос
/ 08 января 2010

Вы сделали предварительное заявление:

int artLength( char article[]); 

но ваша фактическая реализация:

int articleLength( char article[]); 

Сделайте их идентичными (измените одно из них), и ваш проект скомпилируется.

0 голосов
/ 26 августа 2017

Дэн ответит отлично, но программа все равно не скомпилируется. В функции spellCheck вы не передали dictionaryWord [50], поэтому она покажет вам ошибку («слишком мало аргументов передано»), как только вы исправите ошибку, указанную Дэном, и попытаетесь скомпилировать ее.

Это для тех, кто просматривает этот вопрос и пытается реализовать проверку орфографии в C: D

0 голосов
/ 08 января 2010

Вы пытались пройти через ошибки компилятора и понять, что они означают?

Беглый взгляд, вот где я думаю, что проблема в этом. Ошибка компилятора:

ошибка LNK2019: неразрешенный внешний символ _ artLength указан в функции _ spellCheck

Это означает, что компилятор ищет функцию с именем artLength, вызываемую из функции spellCheck. Тем не менее, он не находит его.

Похоже, у вас есть функция с именем articleLength, что, возможно, вы хотели написать?

Однако я бы определенно посоветовал вам просмотреть все остальные выходные данные вашего компилятора и попытаться понять, что это значит. Многое из этого в основном говорит вам, что компилятор не может найти определенные функции, потому что вы вызываете их до того, как вы действительно их напишите.

0 голосов
/ 08 января 2010

Не так много информации, чтобы продолжить - в будущем вам нужно публиковать фактические сообщения об ошибках, которые вы получаете. Однако вам обязательно нужно переместить объявления функций, чтобы они появлялись в коде перед функцией main ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...