Посчитайте, сколько раз каждое слово появляется в данном предложении - PullRequest
0 голосов
/ 15 декабря 2018

Я хочу посчитать, сколько слов встречается в данном предложении.Я использую язык программирования Си.Это не может сосчитать последнее слово.В данной строке подсчитывает каждое слово, сколько раз встречается.Если есть предложение типа red green blue blue green blue, тогда программа должна считать red 2 green 2 and blue 3.Но в моем случае это не считается blue 3.вместо того, чтобы считать blue 2, а затем blue 1:

red 1 
green 2 
blue 2 
blue 
1

Мой код:

#include <stdio.h>
#include <string.h>

int main(void)
{
    int count = 0, c = 0, i, j = 0, k, space = 0;
    char str[1000], p[500][1000], str1[200], ptr1[500][1000];
    char *ptr;
    fgets(str, sizeof(str), stdin);
    for (i = 0;i<strlen(str);i++)
    {
        if ((str[i] == ' ')||(str[i] == ', ')||(str[i] == '.'))
        {
            space++;
        }
    }
    for (i = 0, j = 0, k = 0;j < strlen(str);j++)
    {
        if ((str[j] == ' ')||(str[j] == 44)||(str[j] == 46))  
        {    
            p[i][k] = '\0';
            i++;
            k = 0;
        }        
        else
             p[i][k++] = str[j];
    }
    k = 0;
    for (i = 0;i <= space;i++)
    {
        for (j = 0;j <= space;j++)
        {
            if (i == j)
            {
                strcpy(ptr1[k], p[i]);
                k++;
                count++;
                break;
            }
            else
            {
                if (strcmp(ptr1[j], p[i]) != 0)
                    continue;
                else
                    break;
            }
        }
    }
    for (i = 0;i < count;i++) 
    {
        for (j = 0;j <= space;j++)
        {
            if (strcmp(ptr1[i], p[j]) == 0)
                c++;
        }
        printf("%s %d\n", ptr1[i], c);
        c = 0;
    }
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018
#define MAXWORD 100
#define MAXSTRING 10000

void WordCount()
{
    /*Decalaration */
    char *wordArray[MAXWORD] = { 0 };
    int count[MAXWORD] = {0};
    char inputString[MAXSTRING];
    int wordCount=0;
    /*Reading data from input stream*/
    fgets(inputString, sizeof(inputString), stdin);
    /*Remove trailing new line char*/
    inputString[strlen(inputString) -1] = 0;

    /*Init string tokenizer*/
    char *wordPointer = strtok(inputString, " ");
    while (wordPointer)
    {
        int len = strlen(wordPointer);
        int found = 0;
        for (int i = 0; i < wordCount; i++)
        {
            /*check if word already processed then incrment word count*/
            if (strncmp(wordArray[i], wordPointer, len)==0)
            {
                count[i]++;
                found = 1;
                break;
            }

        }
        if (!found)
        {
            /*Allocate memory for string and copy for future comparision*/
            wordArray[wordCount] = (char*)malloc(len + 1);
            strncpy(wordArray[wordCount], wordPointer, len);
            wordArray[wordCount][len] = 0;
            count[wordCount]++;
            wordCount++;
        }
        wordPointer = strtok(NULL, " ");
    }

    /* print words and their frequency*/
    for (int i = 0; i < wordCount; i++)
    {
        printf("%s - %d \n", wordArray[i], count[i]);
    }
}
0 голосов
/ 15 декабря 2018

fgets добавляет символ перевода строки (\n) к str

Следовательно, ваш str будет содержать

str = "red green blue blue green blue\n"

Таким образом blue не соответствует blue\n и считается blue\n как другое слово.

И то же самое точно отображается на вашем выходе

red 1 
green 2 
blue 2 
blue          //see 1 is printed on next line
1

Таким образом обрежьте \n, как показано ниже.

size_t len = strlen(str);
if (len > 0 && str[len - 1] == '\n')
    str[len - 1] = '\0';
...