Проблема с Chatbot, как подсчитать вхождения некоторых слов в текстовый файл на C - PullRequest
0 голосов
/ 11 февраля 2019

Я создаю команду опроса для своего Twitch Chatbot, но у меня проблемы с обработкой голосов.Мне нужно подсчитать количество голосов в текстовом файле.

Пока я сделал это, но, похоже, он не работает должным образом:

struct VoteData GetMostVote(FILE * fp)
{

    char * buffer = (char *)malloc(sizeof(char)*MAX_BUFFER);

    int lines = GetLines(fp);
    struct VoteData  data[lines];

    int i = 0;

    while(fgets(buffer, MAX_BUFFER, fp) != NULL)
    {
        if(strcmp(data[i].word, buffer) == 0)
        {
            data[i].freq += 1;
        }
        else
        {
           strcpy(data[i].word, buffer);
        }
        i++;
    }

    int c = 0, index = 0;
    for(int j = 0; j < sizeof(data)/sizeof(struct VoteData); j++)
    {
        if(data[j].freq > c)
        {
            index = j;
            c = data[j].freq;
        }
    }

    free(buffer);

    return data[index];
}

где структура VoteData имеет такую ​​форму:

struct VoteData
{
    char word[128];
    int freq;
};

Функция GetMostVote() должна возвращать структуру VoteData, содержащую слово с большим количеством вхождений в текстовом файле и частоту для этого слова.

Но мойchatbot отвечает строкой, которую я использую в другой функции ... и это странно.

EDIT1:

Полагаю, необходимо также опубликовать функцию, где вызывается GetMostVote():

void poll_handler(int sock, int * status, int * vote_count)
{
    FILE * fp;
    int res;
    char * string = (char *)malloc(sizeof(char)*MAX_BUFFER);

    struct VoteData  vote;


    sleep(300);
    *status = 0;    
    *vote_count = 0;

    if(!(fp = fopen("polls/votes.txt", "r")))
    {
        fprintf(stderr, "\nError in reading file\n");
        exit(EXIT_FAILURE);
    }

    vote = GetMostVote(fp);

    strcpy(string, "PRIVMSG #st3ver0nix : Polling terminated, the majority voted: ");
    strcat(string, vote.word);
    strcat(string, "\r\n");

     do{
        res = write(sock, string, strlen(string));
    }while(res < strlen(string));

    fclose(fp);
    free(string);
}

параметры: сокет канала irc, указатели status и voice_count на int, которые используются для обработки голосов.

EDIT2:

Я также публикую функцию, где poll_handler() вызывается:

void CreatePoll(int sock, char * message, char * poll_name, int * status, int * vote_count)
{
    pid_t pid;

    char * name = (char *)malloc(sizeof(char)*MAX_BUFFER);

    GetPollName(message, name);
    strcpy(poll_name, name);


    if((pid = fork()) == -1)
    {
        fprintf(stderr, "\nError in fork\n");
        exit(EXIT_FAILURE);
    }
    if(pid == 0)
    {
        poll_handler(sock, status, vote_count);
    }
    free(name);
}

1 Ответ

0 голосов
/ 11 февраля 2019

return data[index] пытается вернуть локальную переменную.

Это не проблема, так как возвращается значение data[index], а не его адрес.

Основная ошибка в GetMostVote() заключается в том, что в цикле while прочитанная строка голосования сравнивается с неинициализированной data[i].word.Правильным является сравнение текущего голоса с ранее сохраненными данными голосования до тех пор, пока их не станет больше или текущий голос не будет найден среди них:

    while (fgets(buffer, MAX_BUFFER, fp) != NULL)
      for (int j = 0; ; ++j)
        if (j == i)
        {   // store new word
            data[i].freq = 1;
            strcpy(data[i++].word, buffer);
            break;
        }
        else
        if (strcmp(data[j].word, buffer) == 0)
        {   // count known word
            data[j].freq += 1;
            break;
        }

Вторая ошибка в for(int j = 0; j < sizeof(data)/sizeof(struct VoteData); j++): вместо того, чтобы пройтивсе распределенные данные голосования, из которых последующие могут быть неинициализированы, должны рассматриваться только используемые данные:

    for (int j = 0; j < i; j++)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...