2015-04-21 2 views
3

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

int word_count(const char *filename) 
{ 
    int ch; 
    int state; 
    int count = 0; 
    FILE *fileHandle; 
    if ((fileHandle = fopen(filename, "r")) == NULL){ 
     return -1; 
    } 

    state = OUT; 
    count = 0; 
    while ((ch = fgetc(fileHandle)) != EOF){ 
     if (isspace(ch)) 
      state = OUT; 
     else if (state == OUT){ 
      state = IN; 
      ++count; 
     } 
    } 

    fclose(fileHandle); 

    return count; 

} 

Я понял, как иметь дело с пробелами, но я не знаю, как не считать комбинации, которые не имеют по крайней мере один буквенный символ (я знаю о IsAlpha и isdigit, но мне трудно понимание того, как использовать их в моем случае).

Я был бы очень признателен за вашу помощь.

+1

Отделите каждое слово, проверив символы с помощью 'isalnum()', которые будут содержать алфавит и числовые значения. Затем проверьте слово, чтобы увидеть, имеет ли он хотя бы один алфавитный символ, используя 'isalpha()'. –

+2

Чтобы избежать двух пропусков, предложенных @WeatherVane, вы можете иметь основной синтаксический разбор для разделения слов. Когда вы начинаете разбор нового слова, установите флаг в false. Во время разбора 'flag | = isalph (c)' Когда вы находите конец слова, увеличивайте, только если флаг установлен в true –

+0

@ Ôrel Я просто держал его простым - разделяя задачи. –

ответ

1

Вы можете просто заменить:

else if (state == OUT){ 

с:

else if (state == OUT && isalpha(ch)){ 

Таким образом, вы установите состояние в IN с первого символа и считать это слово. Помните, что вы считаете last.First одним словом, подумайте об использовании (!isalnum(ch)) вместо (isspace(ch)).

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