3

我正在尝试计算字符串中出现的单词。对于字符串 S,我需要显示每个单词以及该单词在字符串中出现的次数。

示例:

string = ";! one two, tree foor one two !:;"

结果:

one: 2
two: 2
tree: 1
foor: 1

这是我的代码,但它没有返回正确的计数:

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

int count_word(char * mot, char * text) {
  int n = 0;
  char *p;

  p = strstr(text, mot);

  while (p != NULL) {
    n++;
    p = strstr(p + 1, mot);
  }  

  return n;
}

void show_all_words(char * text) {
    char * p = strtok(text, " .,;-!?");

    while (p != NULL) {
      printf ("%s : %d\n", p, count_word(p, text));
      p = strtok(NULL, " .,;-!?");
    }
}

int main(char *argv[]) {

    char text[] = ";! one two, tree foor one two !:;";
    show_all_words(&text);

    return (EXIT_SUCCESS);
};

它回来了:

one : 1
two : 0
tree : 0
foor : 0
one : 1
two : 0
: : 0
4

2 回答 2

3

该函数strtok更改其参数。您可以通过复制字符串、调用strtok一个副本和count_word另一个来解决问题。

另外,请注意不要将同一单词的计数输出两次。

int count_word(char * mot, char * text, int offset) {
  int n = 0;
  char *p;

  p = strstr(text, mot);
  assert(p != NULL);
  if (p - text < offset)
      return -1; // if the word was found at an earlier offset, return an error code 

  while (p != NULL) {
    n++;
    p = strstr(p + 1, mot);
  }  

  return n;
}

void show_all_words(char * text) {
    char *text_rw = strdup(text); // make a read-write copy to use with strtok
    char * p = strtok(text_rw, " .,;-!?");

    while (p != NULL) {
      int offset = p - text; // offset of the word inside input text
      int count = count_word(p, text, offset);
      if (count != -1) // -1 is an error code that says "already looked at that word"
          printf ("%s : %d\n", p, count );
      p = strtok(NULL, " .,;-!?");
    }
    free(text_rw); // delete the copy
}
于 2012-10-10T20:22:00.190 回答
1

你应该改变方法。您可以使用一个数组来存储每个单词第一次出现的索引和出现次数。仅在字符串中移动一次,但在辅助数组中移动更多次以检查当前单词是否已被计算在内。

我希望对你有用。

于 2012-10-10T20:25:48.017 回答