Работа над программой на C для подсчета символов, слов, предложений, строк или всего вышеперечисленного. - PullRequest
0 голосов
/ 02 ноября 2018

Нас просят создать программу, которая предоставляет таблицу, в которой пользователь может выбирать, считать ли символы, слова, предложения, строки или все вышеперечисленное. Это требует отдельной функции для каждой утилиты. У меня счетчик строк работает отлично, но по какой-то причине функция счетчика символов продолжает возвращать 0. Программа не завершена, но я очень разочарован счетчиком символов.

#include <stdlib.h>

#define WHT_SPC\
         (cur == ' ' || cur == '\n' || cur == '\t')

int countLines(sp1);
int wordCounter(sp1);
int characterCounter(sp1);
int sentenceCounter (sp1);

int main()
{
    int lineCount = 0;
    int wordCount = 0;
    int characterCount= 0;
    int sentenceCount = 0;
    char filename[100];
    FILE* sp1;


    printf("Enter Filename to be read: ");
    gets(filename);
    sp1 = fopen(filename,"r");


    lineCount = countLines(sp1);
    characterCount = characterCounter(sp1);


    printf("Number of Lines: %d\n",lineCount);
    printf("Number of Characters: %d\n",characterCount);

    fclose(sp1);
    return 0;
}


int countLines(sp1)
{
    int curCh;
    int preCh;
    int countLn = 0;

    while ((curCh = fgetc(sp1)) != EOF)
    {
        if (curCh == '\n')
            countLn++;
        preCh = curCh;
    }
    if (preCh != '\n')
        countLn++;


    return countLn;
}

int characterCounter(sp1)
{
    int chr;
    int countCh = 0;

    while ((chr = fgetc(sp1)) != EOF)
    {
        if (chr != 'n' && chr != ' ')
            countCh++;
    }

    return countCh;
}

Я понимаю, что отсутствие комментариев не является идеальным, но моя проблема очень специфична. Не ища ответы, просто совет, чтобы направить меня в правильном направлении.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

fgetc() увеличивает указатель файла.

Таким образом, characterCounter() вызывается после того, как countLines() должен вернуть 0, так как первый встреченный символ - EOF.

Попробуйте использовать fseek(sp1, 0L, SEEK_SET) до characterCounter().

0 голосов
/ 02 ноября 2018

sp1 - это структура, которая, помимо прочего, содержит вашу позицию в файле, который вы читаете. После внутреннего цикла countLines() это поле будет указывать на конец файла. Вам нужно будет вызвать rewind(sp1); перед выполнением других операций чтения в этом же потоке, чтобы он снова начал работать. Не стесняйтесь взглянуть на man rewind!

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