Почему моя реализация wc отключена одним словом? - PullRequest
1 голос
/ 11 апреля 2009

[решено] Написание кода синтаксического анализа является ловушкой. В строке с 15 пробелами будет 15 слов. Пустые строки также будут считаться словом. Вернуться к гибкости и зубров для меня.

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

int     main(int argc, char     *argv[]) {

        FILE    *fp = NULL;
        int             iChars =0, iWords =0, iLines =0;
        int             ch;                             

        /* if there is a command line arg, then try to open it as the file
                otherwise, use stdin */                                   

        fp = stdin;
        if (argc == 2) {
                fp = fopen(argv[1],"r");
                if (fp == NULL) {       
                        fprintf(stderr,"Unable to open file %s. Exiting.\n",argv[1]);
                        exit(1);
                }
        }

        /* read until the end of file, counting chars, words, lines */
        while ((ch = fgetc(fp)) != EOF) {
                if (ch == '\n') {
                        iWords++;
                        iLines++;
                }

                if (ch == '\t' || ch == ' ') {
                        iWords++;
                }

                iChars++;
        }

        /* all done. If the input file was not stdin, close it*/
        if (fp != stdin) {
                fclose(fp);
        }

        printf("chars: %d,\twords: %d,\tlines: %d.\n",iChars,iWords,iLines);
}

ТЕСТОВЫЕ ДАННЫЕ foo.sh

#!/home/ojblass/source/bashcrypt/a.out
This is line 1
This is line 2
This is line 3

ojblass @ линукс-rjxl: ~ / источник / bashcrypt> wc foo.sh

5 13 85 foo.sh

ojblass @ линукс-rjxl: ~ / источник / bashcrypt> a.out foo.sh

символов: 85, слов: 14, строк: 5.

Ответы [ 2 ]

3 голосов
/ 11 апреля 2009

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

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

2 голосов
/ 11 апреля 2009

Вы считаете \ n словом даже для пустой строки.

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