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

また、同じ単語のカウントを2回出力しないように注意してください。

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

アプローチを変更する必要があります。配列を使用して、各単語の最初の出現のインデックスと出現の数を格納できます。文字列内を移動するのは1つだけですが、現在の単語がすでにカウントされているかどうかを確認するために、補助配列内を移動します。

お役に立てば幸いです。

于 2012-10-10T20:25:48.017 に答える