2014-01-27 3 views
0

Я пытаюсь закончить свой проект проверки орфографии и имею несколько проблем. Я пытаюсь использовать strlen и strcmp, чтобы сравнить слова в статье и словаре друг с другом, но компилятор говорит мне, что идентификаторы «strlen» и «strcmp» не определены. Я не уверен, что делать здесь. Кроме того, когда я загружаю char(article) в int ArticleLength, он говорит мне, что я не могу использовать int с char. Я очень новичок и нуждаюсь в некоторой помощи. Вот мой код.Проблемы с проверкой орфографии

#include <stdio.h> // provides declarations for printf and putchar 
#include <stdint.h> // provides declarations for int32_t uint32_t and the other (new) standard C type 
/* You must write this function (spellCheck). Do not change the way the function is declared (i.e., it has 
* exactly two parameters, each parameter is a standard (mundane) C string (see SpellCheck.pdf). 
* You are expected to use reasonable programming style. I *insist* that you indent 
* reasonably and consistently in your code. I strongly encourage you to avoid big functions 
* (while there are always exceptions, a good rule of thumb is about 15 lines in a function). 
* So, plan on implementing spellCheck by writing two or three other "support functions" that 
* help make the actual spell checking easier for you. 
* There are no explicit restictions on using functions from the C standard library. However, 
* for this project you should avoid using functionality from the C++ standard libary. You will 
* almost certainly find it easiest to just write everything you need from scratch! 
*/ 
void spellCheck(char article[], char dictionary[]){ 
int OneLetter(char c); 
void MakeLower(char article[]); 
void KillPunct(char article[]); 
void LowerDictionary(char dictionary[]); 
int ArticleLength(char article[]); 
void ArticleNextWord(char article[], char ArticleWord[], int ArticleLength, char dictionary[]); 
char ArticleWord[50]; 
char DictionaryWord[50]; 
//int ArticleLength = ArticleLength(article); 
KillPunct(article); 
MakeLower(article); 
LowerDictionary(dictionary); 
ArticleNextWord(article, ArticleWord, ArticleLength, dictionary); 
int strncmp(char *ArticleWord, char *DictionaryWord, int n); 
int main(void); { 
    FILE *Dictionary; 
    FILE *Article; 
    int words_read; 
    char* p; 

    Dictionary = fopen("dictionary.txt", "r"); 
    if (Dictionary == 0) { 
     printf("The Dictionary is Empty"); 
     return; 
    } 
    Article = fopen("article.txt", "r"); 
    if (Article == 0) { 
     printf("The Article Has No Words"); 
     return; 
    } 
    p = dictionary; 
    p = fgets(p, 100, Dictionary); 
    while (p != 0) { 
     while (*p != '\0') { 
      p += 1; 
     } 
     p = fgets(p, 100, Dictionary); 
    } 
    p = article; 
    words_read = fread(p, 1, 1000, Article); 
    p += words_read; 
    while (words_read != 0) { 
     words_read = fread(p, 1, 1000, Article); 
     p += words_read; 
     } 
    *p = 0; 
    } 
spellCheck(article, dictionary); 


int ArticlePosition = 0; 
int DictionaryPosition = 0; 

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

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

void MakeLower(char article[]) { 
    int i = 0; 
    for (i += 1; article[i] != 0; i += 1) { 
     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 += 1){ 
     if (dictionary[i] >= 'A' && dictionary[i] <= 'Z'){ 
      dictionary[i] = dictionary[i] + 32; 
     } 
    } 
} 

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

void ArticleNextWord(char article[], char ArticleWord[], int ArticleLength, char DictionaryWord[], char dictionary[]){ 
    int j, i; 
check: 
    int counter = strlen(ArticleWord); 
    while (!OneLetter(article[ArticlePosition])){ 
     if (article[ArticlePosition] == 0){ 
      return; 
     } 
     ArticlePosition += 1; 
    } 
    for (j = 0; article[ArticlePosition] != ' ' || ArticlePosition == ArticleLength; j += 1){ 
     ArticleWord[j] = article[ArticlePosition]; 
     ArticlePosition += 1; 
    } 
    if (counter < 2){ 
     goto check; 
    } 
    ArticleWord[j + 1] = 0; 
    while (!strcmp(ArticleWord, DictionaryWord, strlen(ArticleWord))){ 
     DictionaryNextWord(dictionary, DictionaryWord); 
    } 
    if (strcmp(ArticleWord, DictionaryWord, strlen(ArticleWord))) 
     return; 
    printf(ArticleWord); 
} 

ответ

5

Вам необходимо включить заголовок, который определяет strlen и strcmp

#include <string.h> 

Позже: редактирует на ваш вопрос удалили другие включают в себя. Вам также необходимо #include <stdio.h>

+0

На самом деле, похоже, что он должен реализовывать 'strncmp', или ...? Потому что если он включает string.h, то локальная функция strncmp столкнется со старой устаревшей функцией strncmp в этом заголовке. – Lundin

+0

Я понимаю, что вы имеете в виду. Интересно, является ли передовая декларация ошибкой? Это похоже на довольно запутанный пример, если целью было реализовать 'strncmp'. Если предполагается, что OP уже знает стандартные строковые функции (как намечено с помощью 'strlen' и' strcmp'?), Было бы странно ожидать, что он/она продолжит использовать локальную версию. – simonc

+0

И btw это было _your_ edit, кто изменил свой код и удалил его. Может быть, достойная вещь - восстановить недействительное редактирование, а не ожидать, что OP это сделает? Я исправил его сейчас ... – Lundin

Смежные вопросы