计算C中每个单词的出现次数

问题描述

我想计算一下这个小文本“心碎,心碎”的每一个字出现的次数

此文本的每个单词都在 2d array[100][20] 中,其中 100 是 max_words,20 是 max_word_length我有一个指针 array[100],其中每个指针都指向单词。我找不到一个聪明的方法来计算相同的单词, 例如

a: 2 times
broken: 2 times
heart: 1 time
mind: 1 time
. : 1 time

这些将是指针和单词数组:

POINTERS ARRAY                      WORDS ARRAY
point0(points "a")                  a
point1(points "broken")             broken
point2(points "heart")              heart
point3(points "of")                 of
point4 (points "a")                 mind
point5(points "broken")             .
point6(points "mind")               \0\0\0\0\0
point7(points ".")                  \0\0\0\0\0
NULL                                ..
NULL
..
NULL                                \0\0\0\0\0

旁注:每个单词都是小写。

void frequence_word(char *pointers[],int frequence_array[]) {
  int word = 0;
  int i;
  int count = 1;
  int check[MAX_WORDS];

  for (word = 0; word < MAX_WORDS; word++) {
    check[word] = -1;
  }

  for (word = 0; word < MAX_WORDS; word++) {
    count = 1;

    for (i = word + 1; i < MAX_WORDS; i++) {

      if (pointers[word + 1] != NULL
          && strcmp(pointers[word],pointers[i]) == 0) {
        count++;
        check[i] = 0;
      }

    }
    if (check[word] != 0) {
      check[word] = count;
    }

  }
}

有什么想法吗?

解决方法

这似乎是 strstr 的一个用例。您可以调用 strstr,然后迭代地重新分配给原始字符串,直到达到 NULL。

const char substring[] = "A broken heart of a broken mind";
const char* total = ...;

const char* result;
long count = 0;
while (result = strstr(total,substring)) {
    count++;
    total += (sizeof(substring) - 1);
}

我认为这主要是不言自明的,但我将解释这一行:

total += (sizeof(substring) - 1);

它利用了数组上的 sizeof 返回数组长度的事实。因此,字符数组上的 sizeof 返回其中的字符数。我们减一以忽略空终止符。