質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

Q&A

解決済

2回答

998閲覧

bufferに入れた文章をmecabにより分解して、resultに代入してから、 memotxtを読み込み一致した文章を描画するようにしたい

KZK13

総合スコア43

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

0グッド

0クリップ

投稿2020/07/20 20:17

環境

  • Windows10
  • DXライブラリ
  • mecab

行いことと原因
bufferに入れた文章をmecabにより分解して、resultに代入してから、
memotxtを読み込み一致した文章を描画するようにしたいのですが、
なぜかうまく一致しません。
「タバコ」と入力すると
resultにはタバコの言葉が入るのは確認できました。
そのタバコの言葉がresultに入り、
else if (my_str2(buffer2, result) == 1) により、
buffer2に入るmemo.txtの「タバコ→体に悪い」という文章の含むタバコと一致して
「体に悪い」と描画されるはずが「タバコとは何ですか?」と表示されます。
なぜそうなるか原因がわかりません。

以下はコードです。
コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

解決済みになっていますが、私の趣味でコードを書いてみました。
質問者には全く理解できないでしょう。

C++

1#pragma warning(disable: 4996) 2#include "DxLib.h" 3#include <mecab.h> 4#pragma comment(lib, "libmecab.lib") 5 6// drawString -- 文字列を一文字ずつ表示する 7void drawString(int x, int y, int color, int* pos, const char* str) 8{ 9 char c = str[*pos]; // *pos は pos[0] で表示文字位置 10 if (pos[1] == 0 && c != '\0') *pos += IsDBCSLeadByte(c) ? 2 : 1; 11 if (++pos[1] == 10) pos[1] = 0; // pos[1] はフレームカウンタ 12 DrawFormatString(x, y, color, "%.*s", *pos, str); 13} 14 15const char *setStr(const char *s, int *pos) 16{ 17 pos[0] = pos[1] = 0; 18 return s; 19} 20 21int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) 22{ 23 SetGraphMode(1500, 780, 32); // ウィンドウの大きさを指定 24 ChangeWindowMode(TRUE); // 全画面ではなくウインドウを使用 25 if (DxLib_Init() == -1) return -1; // DXライブラリの初期化 26 SetFontSize(33); // フォントサイズを変更 27 SetDrawScreen(DX_SCREEN_BACK); // 描画先を裏にする 28 int kih = MakeKeyInput(256, FALSE, FALSE, FALSE); // Key Input Handle 29 SetActiveKeyInput(kih); // キー入力をアクティブにする 30 31 int memory = 0; // 記憶モード(memory) 32 int found = 0; // 単語がメモ内で見つかったか(found) 33 char kinbuf[256] = ""; // GetKeyInputString() で取得するキー入力バッファ 34 char memobuf[256] = ""; // fgets() でメモを読み込む行バッファ 35 char strbuf[256] = ""; // drawString() 用の文字列バッファ 36 const char* str = ""; // str は drawString で表示する文字列を指すポインタ 37 int pos[2] = { 0 }; // str の表示文字位置(pos)(初期値をゼロにする) 38 const char* result = NULL; // MeCab の parse() の結果(result) 39 char resbuf[4096] = ""; // result のコピーバッファ 40 char *words[100]; // 単語(word) 名詞、動詞、形容詞のみ 41 int wcount = 0; // 単語の個数(count) 42 char wbuf[256] = ""; // words の表示用バッファ 43 44 while (ProcessMessage() == 0) { 45 ClearDrawScreen(); // 画面の初期化 46 47 DrawKeyInputModeString(1500, 0); // 入力モードを描画 48 DrawKeyInputString(100, 50, kih); // 入力途中の文字列を描画 49 if (CheckKeyInput(kih) != 0) { // エンターキーが押された時 50 GetKeyInputString(kinbuf, kih); // 入力文字列を取得 51 52 MeCab::Tagger* tagger = MeCab::createTagger(""); 53 result = tagger->parse(kinbuf); 54 strcpy_s(resbuf, sizeof resbuf, result); 55 delete tagger; 56 wcount = 0; 57 words[wcount] = strtok(resbuf, "\t\n"); // 単語 58 char *p = strtok(NULL, "\t\n"); // 品詞 59 while (wcount < 100 && p) { 60 if ((strlen(words[wcount]) != 2 || 61 (unsigned char)words[wcount][0] >= 0x88) 62 && (!strncmp(p, "名詞", 4) || !strncmp(p, "動詞", 4) || 63 !strncmp(p, "形容詞", 6)) 64 ) wcount++; 65 words[wcount] = strtok(NULL, "\t\n"); // 単語 66 p = strtok(NULL, "\t\n"); // 品詞 67 } 68 p = wbuf; 69 *p = '\0'; 70 for (int i = 0; i < wcount; i++) p += sprintf(p, "%s ", words[i]); 71 72 if (kinbuf[0] == '\0') { 73 str = setStr("文字列を入力してください。", pos); 74 } 75 else if (strstr(kinbuf, "覚えて")) { 76 str = setStr("何を覚えますか?", pos); 77 memory = 1; 78 } 79 else if (memory == 0) { 80 FILE *fp = fopen("memo.txt", "r"); 81 if (fp == NULL) goto End; // オープンに失敗した場合、終了 82 str = setStr("どうしましたか?", pos); 83 found = 0; 84 while (fgets(memobuf, 256, fp)) { 85 for (int i = 0; i < wcount; i++) { 86 if (strstr(memobuf, words[i])) { 87 found = 1; 88 break; 89 } 90 } 91 if (found) break; 92 } 93 fclose(fp); 94 if (!found) { 95 memobuf[0] = '\0'; 96 sprintf(strbuf, "申し訳ありません。「%s」とは何ですか?", kinbuf); 97 str = setStr(strbuf, pos); 98 } 99 } 100 if (memory == 1) { 101 if (strstr(kinbuf, "→")) { 102 FILE *fp = fopen("memo.txt", "a"); 103 if (fp == NULL) goto End; // オープンに失敗した場合、終了 104 fprintf(fp, "%s\n", kinbuf); 105 fclose(fp); 106 sprintf(strbuf, "「%s」を記憶しました", kinbuf); 107 str = setStr(strbuf, pos); 108 memory = 0; 109 } else { 110 str = setStr("→を含む文字列を入力してください", pos); 111 } 112 } 113 SetActiveKeyInput(kih); // 再度キー入力をアクティブにする 114 SetKeyInputString("", kih); // キー入力文字列を初期化する 115 } 116 117 drawString(0, 0, GetColor(5, 255, 255), pos, str); // 1文字ずつ表示 118 DrawFormatString(0, 50, GetColor(255, 255, 255), memory ? "記憶:" : "入力:"); 119 DrawFormatString(100, 200, GetColor(5, 255, 0), "memobuf = [%s]", memobuf); 120 DrawFormatString(100, 300, GetColor(175, 80, 100), "words = [%s]", wbuf); 121 DrawFormatString(100, 400, GetColor(255, 255, 0), "kinbuf = [%s]",kinbuf); 122 DrawFormatString(100, 500, GetColor(255, 255, 0), "result = [%s]", result); 123 124 ScreenFlip(); // 裏画面の内容を表画面に反映させる 125 } 126End: 127 DeleteKeyInput(kih); // 用済みのキー入力を削除する(バッファの解放) 128 DxLib_End(); // DXライブラリの使用終了 129 return 0; 130} 131

追記
メモリーリークしないように delete tagger; を追加しました。

投稿2020/07/21 22:26

編集2020/07/22 12:46
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

「タバコ」と入力すると
resultにはタバコの言葉が入るのは確認できました。

ホント?

C++

1#include <mecab.h> 2#include <stdio.h> 3 4int main() { 5 char buffer[] = "タバコ"; 6 MeCab::Tagger* tagger = MeCab::createTagger(""); 7 const char* result = tagger->parse(buffer); 8 printf("[%s]\n", result); 9 return 0; 10}

実行結果

[タバコ 名詞,一般,*,*,*,*,タバコ,タバコ,タバコ EOS ]

resultに得られる結果は ("タバコ"を含みますが)"タバコ"ではありませんけど。

投稿2020/07/20 23:36

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KZK13

2020/07/21 04:06

タバコだけならいいですが、タバコ以外の「名詞,一般,*,*,*,*,タバコ,タバコ,タバコ EOS」の部分がメモと合わないため本来のように動かないとわかりました。
episteme

2020/07/21 06:48 編集

いやそんなことハナっからわかってたことでしょ? じゃなかったらなんでこんな↓質問したんです? 回答者をおちょくってるんですか? https://teratail.com/questions/278952 質問に寄せられた回答を活かせないなら質問なんかしないでほしいね。
KZK13

2020/07/21 07:16

おちょくってるわけないじゃないですか。 何の得があって人をおちょくるのか教えてほしいですね。 >>質問に寄せられた回答を活かせないなら質問なんかしないでほしいね 活かせていないわけではないですが、epistemeさんに解答して頂かなくても結構ですのでどうかお引き取りください。
episteme

2020/07/21 07:23

> おちょくってるわけないじゃないですか。 だったらなんでこんな↓質問したんです? これで得られた回答を活かせていないじゃない。 https://teratail.com/questions/278952
KZK13

2020/07/21 07:34

episteme殿に答える義理はありませぬ。 引き取って頂きたい。
episteme

2020/07/21 07:53 編集

つまり答えに窮したってことか、窮するよね当然。 「KZK13は昨日教わったことすら活かせません」と公言することになるからね。 あたしゃ誰の質問だろうが、答えられるなら答えるよ。 それを受け入れるか否かは質問者の勝手だ。
KZK13

2020/07/21 10:48 編集

されどもう一度、 episteme殿に答える義理はありませぬ。(所詮は推測なのでどうぞ勝手に考えてください。) 引き取って頂きたい。(epistemeさんは、マゾなのかな?)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問