質問するログイン新規登録

回答編集履歴

3

コードの修正

2020/07/22 12:46

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -55,6 +55,7 @@
55
55
  MeCab::Tagger* tagger = MeCab::createTagger("");
56
56
  result = tagger->parse(kinbuf);
57
57
  strcpy_s(resbuf, sizeof resbuf, result);
58
+ delete tagger;
58
59
  wcount = 0;
59
60
  words[wcount] = strtok(resbuf, "\t\n"); // 単語
60
61
  char *p = strtok(NULL, "\t\n"); // 品詞
@@ -131,4 +132,6 @@
131
132
  return 0;
132
133
  }
133
134
 
134
- ```
135
+ ```
136
+ **追記**
137
+ メモリーリークしないように delete tagger; を追加しました。

2

バグ修正2

2020/07/22 12:46

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -60,7 +60,7 @@
60
60
  char *p = strtok(NULL, "\t\n"); // 品詞
61
61
  while (wcount < 100 && p) {
62
62
  if ((strlen(words[wcount]) != 2 ||
63
- (unsigned char)words[wcount][0] > 0x88)
63
+ (unsigned char)words[wcount][0] >= 0x88)
64
64
  && (!strncmp(p, "名詞", 4) || !strncmp(p, "動詞", 4) ||
65
65
  !strncmp(p, "形容詞", 6))
66
66
  ) wcount++;

1

バグ修正

2020/07/21 23:10

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -42,6 +42,7 @@
42
42
  char resbuf[4096] = ""; // result のコピーバッファ
43
43
  char *words[100]; // 単語(word) 名詞、動詞、形容詞のみ
44
44
  int wcount = 0; // 単語の個数(count)
45
+ char wbuf[256] = ""; // words の表示用バッファ
45
46
 
46
47
  while (ProcessMessage() == 0) {
47
48
  ClearDrawScreen(); // 画面の初期化
@@ -58,13 +59,17 @@
58
59
  words[wcount] = strtok(resbuf, "\t\n"); // 単語
59
60
  char *p = strtok(NULL, "\t\n"); // 品詞
60
61
  while (wcount < 100 && p) {
62
+ if ((strlen(words[wcount]) != 2 ||
61
- if ((strlen(words[wcount]) != 2 || words[wcount][0] > 0x88)
63
+ (unsigned char)words[wcount][0] > 0x88)
62
64
  && (!strncmp(p, "名詞", 4) || !strncmp(p, "動詞", 4) ||
63
65
  !strncmp(p, "形容詞", 6))
64
66
  ) wcount++;
65
67
  words[wcount] = strtok(NULL, "\t\n"); // 単語
66
68
  p = strtok(NULL, "\t\n"); // 品詞
67
69
  }
70
+ p = wbuf;
71
+ *p = '\0';
72
+ for (int i = 0; i < wcount; i++) p += sprintf(p, "%s ", words[i]);
68
73
 
69
74
  if (kinbuf[0] == '\0') {
70
75
  str = setStr("文字列を入力してください。", pos);
@@ -110,14 +115,11 @@
110
115
  SetActiveKeyInput(kih); // 再度キー入力をアクティブにする
111
116
  SetKeyInputString("", kih); // キー入力文字列を初期化する
112
117
  }
113
- char wstr[256], *p = wstr;
114
- *p = '\0';
115
- for (int i = 0; i < wcount; i++) p += sprintf(p, "%s ", words[i]);
116
118
 
117
119
  drawString(0, 0, GetColor(5, 255, 255), pos, str); // 1文字ずつ表示
118
120
  DrawFormatString(0, 50, GetColor(255, 255, 255), memory ? "記憶:" : "入力:");
119
121
  DrawFormatString(100, 200, GetColor(5, 255, 0), "memobuf = [%s]", memobuf);
120
- DrawFormatString(100, 300, GetColor(175, 80, 100), "words = [%s]", wstr);
122
+ DrawFormatString(100, 300, GetColor(175, 80, 100), "words = [%s]", wbuf);
121
123
  DrawFormatString(100, 400, GetColor(255, 255, 0), "kinbuf = [%s]",kinbuf);
122
124
  DrawFormatString(100, 500, GetColor(255, 255, 0), "result = [%s]", result);
123
125
 
@@ -128,4 +130,5 @@
128
130
  DxLib_End(); // DXライブラリの使用終了
129
131
  return 0;
130
132
  }
133
+
131
134
  ```