2015-02-28 7 views
0

Кажется, я правильно понял строки, символы и пробелы. Однако мне сложно понять, как считать слова. Они не должны быть в форме словаря; например, fdasf fdjsak fea будет три слова.Подсчет слов в программе подсчета слов из имени файла

Это то, что у меня есть:

#include <stdio.h> 

int main(int argc, char* argv[]) { 
    int ccount = 0; 
    int wcount = 1; 
    int lcount = 0; 
    int scount = 0; 

    char* filename = argv[1]; 
    printf("filename is: %s\n", filename); 

    FILE* infile; 
    infile = fopen(filename, "r"); 

    if (infile == NULL) { 
    printf("%s: is not a valid file\n", filename); 
    return -1; 
    } 

    char c; 
    while ((c = fgetc(infile)) != EOF) { 
    if (c == ' ') { 
     wcount++; 
    } 
    if (c == '\n') { 
     lcount++; 
    } 
    if (c != ' ' || c != '\n') { 
     ccount++; 
    } 
    if (c == ' ') { 
     scount ++; 
    } 
    } 

    printf("total number of lines: %d\n", lcount); 
    printf("total number of characters: %d \n", ccount); 
    printf("total number of non-whitespace characters: %d \n", scount); 
    printf("total number of words: %d \n", wcount); 

    return 0; 
} 
+0

после того, как вы определили, как вы определяете слово (например, последовательность букв нижнего и верхнего регистра, а также букву верхнего и нижнего регистра, за которой следуют все строчные буквы, буквенно-цифровые, ...), проверьте, соответствует ли текущий символ шаблону или нет. Переходы состояния согласования шаблонов указывают начало/конец слова. Подсчитайте количество пар начала/конца. – SleuthEye

+0

Об этом много раз ответили на SO. предлагают провести немного исследований. – user3629249

+1

'words per-line = #whitespace_breaks + 1' и помните, что вам нужно рассматривать любую последовательность пробельных символов' space, tab и т. Д. '(Или их кратность) как единый whitespace_break с целью вычисления количества слова. –

ответ

1

Хотя Есть несколько способов сделать это, вот краткий краткий пример, который читает из stdin, вы можете просто изменить stdin к infile для ваших целей (после открытия infile). Это не считается пустой строкой ('\n') в качестве слова. Вы можете переделать это в соответствии с вашими потребностями. В нем содержатся комментарии, объясняющие логику. Дайте мне знать, если у вас есть вопросы:

#include <stdio.h> 

int main (void) { 

    char *line = NULL; /* pointer to use with getline() */ 
    char *p = NULL;  /* pointer to parse getline return */ 
    ssize_t read = 0; /* actual chars read per-line  */ 
    size_t n = 0;  /* max chars to read (0 - no limit)*/ 
    int spaces = 0;  /* counter for spaces and newlines */ 
    int total = 0;  /* counter for total words read */ 

    printf ("\nEnter a line of text (or ctrl+d to quit)\n"); 

    while (printf ("\n input: ") && (read = getline (&line, &n, stdin)) != -1) 
    { 
     /* strip trailing '\n' or '\r' */ 
     while (line[read-1] == '\n' || line[read-1] == '\r') 
      line[--read] = 0; 

     spaces = 0; 
     p = line; 

     if (read > 0) {  /* read = 0 covers '\n' case (blank line with [enter]) */ 
      while (*p) {       /* for each character in line  */ 
       if (*p == '\t' || *p == ' ') {  /* if space,  */ 
        while (*p == '\t' || *p == ' ') /* read all spaces */ 
         p++; 
        spaces += 1;     /* consider sequence of spaces 1 */ 
       } else 
        p++;       /* if not space, increment pointer */ 
      } 
      total += spaces + 1;     /* words per-line = spaces + 1  */ 
     } 

     printf (" chars read: %2zd, spaces: %2d, words: %2d, total: %3d | '%s'\n", 
       read, spaces, (spaces > 0) ? spaces+1 : 0, 
       total, (read > 1) ? line : "[enter]"); 
    } 

    printf ("\n\n Total words read: %d\n\n", total); 

    return 0; 

} 

выход:

$ ./bin/countwords 

Enter a line of text (or ctrl+d to quit) 

input: my dog has fleas 
chars read: 16, spaces: 3, words: 4, total: 4 | 'my dog has fleas' 

input: 
chars read: 0, spaces: 0, words: 0, total: 4 | '[enter]' 

input: fee fi fo fum 
chars read: 13, spaces: 3, words: 4, total: 8 | 'fee fi fo fum' 

input: 

    Total words read: 8 

Примечание: расширить пробельные символы распознан, вы можете включать заголовок ctype.h и использовать функции isspace() вместо простой проверки на spaces и tabs, как это делается выше. Упущение заключается в намерении ограничить требуемые файлы заголовков stdio.h.

+0

Спасибо! Ваш код дает понять! Тем не менее, мой код теперь, кажется, хорошо читает ваш текст с нужным количеством пробелов, слов и символов, еще прочитав, когда я открываю огромный документ, он не дает мне правильного количества слов. Кажется, он работает только с небольшими текстами. Любые причины? – JBo

+0

Единственная проблема, которую я мог видеть, если вы переполняете 'int', попробуйте переопределить' пробелы' и 'total' как' long' вместо 'int'. Мы ничего не выделяем, которые потребуют перераспределения для длинных документов. Дайте мне знать, если это исправит проблему. –