解決できない問題があります。
buffer2に保存した文章が入りません。
あの後、覚えてという言葉の後で○○は◇◇であるという形式にすることで文章をメモに記憶させることはできました。
その次に覚えさせた文章から特定の言葉が含まれていた場合、その文章を少し改造したものを表示するというプログラムを作ろうとしています。
まず、「覚えて」と入力した後に
例えば、「ジュニーは戦場へ行くという映画は面白い。」、「明日は晴れ。」、「どすこいはお相撲。」と入力してエンターキーを押します。
するとtxtに「ジュニーは戦場へ行くという映画は面白い。」、「明日は晴れ。」、「どすこいはお相撲。」と保存されます。
その後に「どんな映画が好きですか?」と入力すると、メモから if (my_str2(buffer2, "映画")) という条件により「映画」を含んだ文章を読み込み、
「ジュニーは戦場へ行くという映画は面白い。」をbuffer2に入れて「ジュニーは戦場へ行くという映画は面白い。」と返すようにします。
しかし、実際に実行するとbuffer2の方で文章が読み込めていますが、「ジュニーは戦場へ行くという映画は面白い。」という結果は表示されませんでした。
if (my_str2(buffer2, "映画")) という条件により「映画」を含んだ文章を読み込み、表示できると思っていました。しかし、実際は「映画」という言葉をメモから読み込んで一致させただけで、「映画」という言葉を含んだ文章を表示させるための処理が書かれていませんでした。
また、どうやったら太い黒文字で書いたような処理ができるのかの書き方がわかりません。
どうか私が書けるヒントとなるサンプルのプログラムなど頂けないでしょうか。
期待する結果: 「映画」という言葉を含んだ文章である"ジュニーは戦場へ行くという映画は面白い。"が画面に出力されるというのが期待です。
汚いかもしれませんが、必要最低限の部分のみでコードを編集しました。
短くしたコードです
すいません、kazuma-sさん、編集後のプログラムでもなぜかエラーが起きます。
私のビルドの仕方が悪いのかもしれません。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/28 10:54
2020/06/28 10:58
2020/06/28 11:00
2020/06/28 11:08 編集
2020/06/28 11:09
2020/06/28 11:16 編集
2020/06/28 11:17
2020/06/28 11:24
2020/06/28 11:29 編集
2020/06/28 11:30
2020/06/28 11:32
2020/06/28 11:34
2020/06/28 11:53 編集
2020/06/28 11:53
2020/06/28 12:21 編集
2020/06/28 12:25
2020/06/28 12:26
2020/06/28 12:54 編集
2020/06/28 12:58
2020/06/28 13:07 編集
2020/06/28 13:20 編集
2020/06/28 14:21 編集
2020/06/28 14:46 編集
2020/06/28 15:16 編集
2020/06/28 15:22
2020/06/28 15:27 編集
2020/06/28 15:28
2020/06/28 15:36 編集
2020/06/28 15:38
2020/06/28 15:45 編集
2020/06/28 20:22 編集
2020/07/01 01:56
2020/07/01 02:44
回答3件
0
こちらがコードです。https://pastebin.com/Kjeyvx2v
kazuma-sさんから頂いたコードを利用させていただいています。
解決したコードというのを見ました。
私のコードはコピペはされていましたが、利用されていません。
関数 drawMemo は呼び出されもしていません。
ユーザからの入力があるたびに毎回 readMemo と findMemo が
呼び出されていますが、検索結果は全く利用されていません。
char *memo[10]; がグローバル変数の char memo[1000]; になっています。
なぜグローバル変数にしたんですか?
readMemo、drawMemo、findMemo の第1引数が何のために char **memo に
なっているのか全く理解していませんね。
readMemo の中で使っている strdup の意味を調べていませんね。
strdup は内部で malloc を呼び出すので、memo[i] = strdup(buf); を
2度以上実行するとメモリーリークになります。
さて、私のコードが利用されていないこと以外に、さまざまな問題点があります。
コンパイルして起動するとどうなりますか?
文字が重なって表示されます。
文字列を入力しようとすると、画面の真ん中に「全角ひらがな」と表示されます。
正気の沙汰とは思えません。
「覚えて」と入力した後、いくら文字列を入力しても覚えてくれているようには
見えません。覚えてくれたのは文字列を「→」を含めた場合だけです。
本当に最初の質問の内容は解決されたのですか?
本当に最初の質問の内容は解決されたのですか?
本当に最初の質問の内容は解決されたのですか?
コードは相変わらず、無駄な記述ばかり。
#include <iostream>
#include <fstream>
#include <random>
#include <vector>
これらは何のためにあるんですか?
char String[256];
int InputHandleA;
int modoru = 0;
const int PAD_DOWN = 0;
std::string result;
これらの変数は全く使用されていません。
int InputHandle;
char buffer[256];
char buffer2[256];
int z;//関数drawString外でも使えるように外にも定義を書いた。
これらは WinMain の中だけで使用されているので、そこに書くべきじゃないのですか?
char c = str[z][posmozi[z]];//関数drawString外でも使えるように外にも定義を書いた。
c も drawString の中だけで使用されています。
また、グローバル変数にして、こんな変な初期化は要りません。
私のコードは my_str2 を使わずに検索ができていますよね。
不思議だと思わないのですか?
strstr があるので、my_str2 は要らないのに気が付かないのですか?
drawString の中に
DrawFormatString(300, 300, (0, 0, 255), "countS[0]は%d", countS[0]);
というのがありますが、(0, 0, 255) の意味が分かってこう書いていますか?
while (ProcessMessage() == 0) のループが終了した後に、
ClearDrawScreen(); ScreenFlip(); にしていますが、これも無意味です。
ProcessMessage() が 0 を返すのは、ウィンドウの x ボタンが押されて
描画処理がすべて終了するときです。
fopen が失敗した時 printf("cannot open\n"); をやっていますが、
これも無意味です。
main ではなく WinMain で始まるプログラムは標準出力先の
端末(terminal または console) を持っていませんから、printf できません。
さらに、コメントは意味不明、間違いだらけ。
ということで、最低限のコードに書き直してみました。
C++
1#pragma warning(disable: 4996) 2#include "DxLib.h" 3 4// drawString -- 文字を一字ずつ表示する 5void drawString(int x, int y, int color, int *pos, const char *str) 6{ 7 char c = str[*pos]; // *pos は pos[0] で表示文字位置 8 if (pos[1] == 0 && c != '\0') *pos += IsDBCSLeadByte(c) ? 2 : 1; 9 if (++pos[1] == 10) pos[1] = 0; // pos[1] はフレームカウンタ 10 DrawFormatString(x, y, color, "%.*s", *pos, str); 11} 12 13int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) 14{ 15 char buffer[256]; // ユーザ入力文字列 16 char buffer2[256]; // ファイルから読み込む 1行の文字列 17 int hyouzi = 0; // ??? 18 int mozicount = 0; // ??? 19 int gimonnlock = 0; // ??? 20 int gimon = 0; // ??? 21 int memorycount = 0; // ??? 22 int memory = 0; // ??? 23 24 const char *z = ""; // z は drawString で表示する文字列 25 int pos[2] = { 0 }; // z の表示文字位置(初期値をゼロにする) 26 27 unsigned buf_color = GetColor(64, 255, 192); 28 unsigned z_color = GetColor(5, 255, 255); 29 unsigned debug_color = GetColor(255, 255, 0); 30 31 SetGraphMode(1500, 780, 32); // ウィンドウの大きさを指定 32 ChangeWindowMode(TRUE); // 全画面ではなくウインドウを使用 33 if (DxLib_Init() == -1) return -1; // DXライブラリの初期化 34 SetFontSize(33); // フォントサイズの変更 35 SetDrawScreen(DX_SCREEN_BACK); // 描画先を裏にする 36 int InputHandle = MakeKeyInput(150, FALSE, FALSE, FALSE); 37 SetActiveKeyInput(InputHandle); // 作成したキー入力ハンドルをアクティブにする 38 39 while (ProcessMessage() == 0) { 40 ClearDrawScreen(); // 画面の初期化 41 DrawKeyInputModeString(1500, 0); // 入力モードを描画 42 DrawKeyInputString(0, 0, InputHandle); // 入力途中の文字列を描画 43 44 if (CheckKeyInput(InputHandle) != 0) { 45 hyouzi = 0; 46 gimon = 0; 47 memorycount = 0; 48 ++mozicount; 49 GetKeyInputString(buffer, InputHandle); // 入力された文字列を取得 50 51 if (strstr(buffer, "覚えて")) { 52 z = "何を覚えますか?", pos[0] = pos[1] = 0; 53 ++mozicount; 54 memory = 1; 55 gimon = 0; 56 } 57 else if (memory == 0) { 58 FILE *fp = fopen("memo.txt", "r"); 59 if (fp == NULL) goto dxlib_end; 60 z = "どうしましたか?", pos[0] = pos[1] = 0; 61 while (fgets(buffer2, 256, fp)) { // ファイルから読み込む 62 if (strstr(buffer, "映画") && strstr(buffer, "好き") && strstr(buffer, "?")) { 63 if (strstr(buffer, "どんな")) { 64 ++mozicount; 65 gimonnlock = 1; 66 if (strstr(buffer2, "映画") && strstr(buffer2, "どんな")) { 67 hyouzi = 1; 68 break; 69 } 70 } 71 if (strstr(buffer, "なんで") || strstr(buffer, "なぜ")) { 72 ++mozicount; 73 gimonnlock = 1; 74 if (strstr(buffer2, "映画") && strstr(buffer2, "なぜ")) { 75 hyouzi = 1; 76 break; 77 } 78 } 79 } 80 if (strstr(buffer2, buffer)) { 81 hyouzi = 1; 82 break; 83 } 84 if (hyouzi == 0) { 85 if (strcmp(buffer2, buffer) == 0) { 86 gimon = 1; 87 } 88 } 89 } 90 fclose(fp); 91 } 92 if (memory == 1 && strstr(buffer, "→")) { 93 ++mozicount; 94 memory = 2; 95 z = "記憶しました。", pos[0] = pos[1] = 0; 96 } 97 SetActiveKeyInput(InputHandle); // 再度インプットハンドルをアクティブにする 98 SetKeyInputString("", InputHandle); // 入力文字列を初期化する 99 } 100 if (memory == 2) { 101 FILE *fp = fopen("memo.txt", "a"); 102 if (fp == NULL) goto dxlib_end; 103 fprintf(fp, "%s\n", buffer); // ファイルに書く 104 fclose(fp); 105 memory = 0; 106 memorycount = 1; 107 } 108 DrawFormatString(100, 320, debug_color, "mozicount = %d, z = %s", 109 mozicount, z); 110 DrawFormatString(100, 360, debug_color, "gimonnlock = %d, memory = %d", 111 gimonnlock, memory); 112 DrawFormatString(100, 400, debug_color, "gimon = %d, hyouzi = %d, memorycount = %d", 113 gimon, hyouzi, memorycount); 114 115 if (mozicount > 0) { 116 drawString(10, 100, z_color, pos, z); 117 } 118 if (gimon == 0 && hyouzi == 1) { 119 DrawFormatString(100, 180, buf_color, "buffer2 = %s", buffer2); 120 } 121 if (hyouzi == 0 && mozicount > 0 && memory == 0&& memorycount == 0) { 122 z = "", pos[0] = pos[1] = 0; 123 DrawFormatString(10, 110, buf_color, "申し訳ありません %s とは何ですか?", buffer); 124 } 125 126 ScreenFlip(); // 裏画面の内容を表画面に反映させる 127 } 128dxlib_end: 129 DeleteKeyInput(InputHandle); // 用済みのインプットハンドルを削除する 130 DxLib_End(); // DXライブラリの使用終了 131 return 0; 132}
追記
基礎の基礎が分かっていないんですね。
長さ3 の文字列 "abc" は { 'a', 'b', 'c', '\0' } の 4バイト。
長さ1 の文字列 "a" は { 'a', '\0' } の 2バイト。
長さ0 の文字列 "" は { '\0' } の 1バイト。
"\0" は { '\0', '\0' } の 2バイト。でも strlen("\0") は 0文字。
次に、文字列の比較は == では出来ません。
if (buffer == "abc") はダメで、
if (strcmp(buffer, "abc") == 0) と書きます。
buffer が空(0文字)というのは、buffer[0] が '\0' ということ。
if (buffer[0] == '\0') で調べることができます。
if (strlen(buffer) == 0) や if (strcmp(buffer, "") == 0) でも
分かりますが、関数を呼び出すのは無駄です。
こんなことも理解していなくて、アプリを作ろうとよく思いますね。
さて、buffer が空の時、if (strstr(buffer2, buffer)) が真になりますから
その先には行きません。その前に調べないといけないでしょう。
diff
1 } 2 } 3 } 4- if (strstr(buffer2, buffer)) { 5+ if (buffer[0] == '\0') { 6+ hyouzi = 0; 7+ } 8+ else if (strstr(buffer2, buffer)) { 9 hyouzi = 1; 10 break; 11 }
ところで、どのような動作を期待しているのでしょうか?
次のような操作で、memo.txt に追加できることは確認できたのですが、
本当にこのような動作を期待しているのでしょうか?
空の memo.txt を用意して、プログラムを起動します。
「覚えて」エンター
「→ジュニーは戦場へ行くという映画は面白い。」エンター
「覚えて」エンター
「→明日は晴れ。」エンター
「覚えて」エンター
「→どすこいはお相撲。」エンター
「晴れ」エンター
「buffer2 = →明日は晴れ。」と表示される。
memo.txt には、入力文字列が追加されている。
「→」がないと追加されません。
投稿2020/07/05 13:31
編集2020/07/05 17:48総合スコア8224
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/05 14:39
2020/07/05 14:54
2020/07/05 16:37
2020/07/05 22:20
2020/07/06 04:37
2020/07/06 04:42 編集
2020/07/06 04:45
2020/07/06 04:59 編集
2020/07/06 05:04
2020/07/06 06:42
0
ベストアンサー
memo.txt
「ジョニーは戦場へ行った」という映画は面白い。 明日は晴れ。 どすこいはお相撲。 映画館はどこも満席。 休日はおうちで映画鑑賞。
C++
1#pragma warning(disable: 4996) 2#include "DxLib.h" 3 4int readMemo(char **memo, int n) 5{ 6 FILE *fp = fopen("memo.txt", "r"); 7 if (fp == NULL) return 0; 8 int i; 9 char buf[256]; 10 memo[0] = ""; 11 for (i = 1; i < n && fgets(buf, sizeof buf, fp); i++) 12 memo[i] = strdup(buf); 13 fclose(fp); 14 return i; 15} 16 17void drawMemo(char **memo, int n) 18{ 19 int x = 10, y = 420, color = GetColor(0, 255, 0); 20 for (int i = 1; i < n; i++) { 21 DrawFormatString(x, y, color, "%2d: %s", i, memo[i]); 22 y += 30; 23 } 24} 25 26int findMemo(char **memo, int n, char *str) 27{ 28 if (str[0] != '\0') 29 for (int i = 0; i < n; i++) 30 if (strstr(memo[i], str)) return i; 31 return 0; 32} 33 34int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) 35{ 36 SetGraphMode(1280, 720, 32); // ウィンドウの大きさを指定 37 ChangeWindowMode(TRUE); // 全画面ではなくウインドウを使用 38 if (DxLib_Init() == -1) return -1; // DXライブラリの初期化 39 SetDrawScreen(DX_SCREEN_BACK); // 描画先を裏画面にする 40 SetFontSize(24); // フォントサイズを 24に変更 41 42 char *memo[10]; 43 int n_memo = readMemo(memo, 10); 44 if (n_memo == 0) { DxLib_End(); return 1; } 45 int n_show = 0; 46 47 int kih = MakeKeyInput(256, FALSE, FALSE, FALSE); // key input handle 48 SetActiveKeyInput(kih); 49 50 char buf[256] = ""; 51 52 int input_color = GetColor(255, 255, 0); 53 int show_color = GetColor(255, 0, 255); 54 int buf_color = GetColor(0, 255, 255); 55 56 while (ProcessMessage() == 0) { 57 ClearDrawScreen(); // 画面の初期化 58 59 DrawKeyInputModeString(1200, 0); // 入力モードを描画 60 DrawString(10, 30, "入力: ", input_color); 61 DrawKeyInputString(80, 30, kih); // 入力途中の文字列を描画 62 63 if (CheckKeyInput(kih) != 0) { // 入力完了なら 64 GetKeyInputString(buf, kih); // 入力文字列を取得 65 n_show = findMemo(memo, n_memo, buf); // メモを検索 66 SetActiveKeyInput(kih); 67 SetKeyInputString("", kih); 68 } 69 DrawFormatString(10, 80, buf_color, "検索文字列: %s", buf); 70 DrawFormatString(10, 110, show_color, "検索結果: %s", memo[n_show]); 71 drawMemo(memo, n_memo); // メモを表示 72 73 ScreenFlip(); // 裏画面の内容を表画面に反映させる 74 } 75 DeleteKeyInput(kih); 76 DxLib_End(); 77 return 0; 78}
追記
memo[0] = "";
や or
でエラーにならなかったのは、
私のコンパイラが Visual C++ 2017 のものであったからだと思われます。
memo[0] = (char *)"";
に変更したのはエラーメッセージに
「error C2440: '=': 'const char [1]' から 'char *' に変換できません。」
とあったからです。キャスト (char *) により強制的に変換させました。
他にコードについての疑問点はありませんか?
完全に理解されましたか?
おまけ
C++
1#pragma warning(disable: 4996) 2#include <stdio.h> // fopen, fgets, fclose, printf, puts 3#include <string.h> // strdup, strstr, strchr, strcmp, strlen 4 5#define MEMO_FILE "memo2.txt" 6 7enum { SEARCH, MEMORY }; // 検索モード、記憶モード 8 9int getline(char *buf, int size, FILE *fp) 10{ 11 if (!fgets(buf, size, fp)) return EOF; 12 char *p = strchr(buf, '\n'); 13 if (p) *p = '\0'; 14 return strlen(buf); 15} 16 17int readMemo(char **memo, int size) 18{ 19 FILE *fp = fopen(MEMO_FILE, "r"); 20 if (fp == NULL) return 0; 21 int i; 22 char buf[256]; 23 memo[0] = (char *)""; 24 for (i = 1; i < size && getline(buf, sizeof buf, fp) >= 0; i++) 25 memo[i] = strdup(buf); 26 fclose(fp); 27 return i; 28} 29 30int saveMemo(char **memo, int n) 31{ 32 FILE *fp = fopen(MEMO_FILE, "w"); 33 if (fp == NULL) return 1; 34 for (int i = 1; i < n; i++) 35 fprintf(fp, "%s\n", memo[i]); 36 fclose(fp); 37 return 0; 38} 39 40void drawMemo(char **memo, int n) 41{ 42 for (int i = 1; i < n; i++) 43 printf("%2d: %s\n", i, memo[i]); 44} 45 46int addMemo(char **memo, int size, int n, const char *str) 47{ 48 if (n >= size) return 1; 49 memo[n++] = strdup(str); 50 return 0; 51} 52 53int findMemo(char **memo, int n, char *str) 54{ 55 for (int i = 0; i < n; i++) 56 if (strstr(memo[i], str)) return i; 57 return 0; 58} 59 60int main() 61{ 62 char *memo[100]; 63 memo[0] = (char *)""; 64 int n_memo = 1; 65 int mode = SEARCH; 66 67 puts("コマンド: 記憶、検索、表示、保存、取得、終了"); 68 69 while (1) { 70 char buf[256]; 71 printf("入力: "); 72 if (getline(buf, sizeof buf, stdin) < 0) break; 73 if (buf[0] == '\0') continue; 74 75 if (!strcmp(buf, "終了")) break; 76 else if (!strcmp(buf, "記憶")) mode = MEMORY; 77 else if (!strcmp(buf, "検索")) mode = SEARCH; 78 else if (!strcmp(buf, "表示")) drawMemo(memo, n_memo); 79 else if (!strcmp(buf, "保存")) saveMemo(memo, n_memo); 80 else if (!strcmp(buf, "取得")) n_memo = readMemo(memo, 100); 81 else if (mode == MEMORY) { 82 if (addMemo(memo, 100, n_memo, buf)) puts(" 追加できません"); 83 else n_memo++; 84 } 85 else { // mode == SEARCH 86 int n_find = findMemo(memo, n_memo, buf); 87 if (n_find > 0) printf(" 検索結果: %s\n", memo[n_find]); 88 else printf(" 「%s」は見つかりません\n", buf); 89 } 90 } 91 return 0; 92}
追記2
解決済みになってしまいましたが、どのようにして解決したのですか?
「覚えて」のあと、記憶させる文字列を複数入力し、「映画」で検索するコードが
書けたのなら、それを提示してください。
私の回答のコメント欄に、
「これから読ませていただくので疑問はその後に答えさせて頂けないでしょうか。」
と書いたことを実行してください。
おまけのコードで、「入力: 」よりも現在のモードを表示したほうがよいので
次のように変更してください。
diff
1- printf("入力: "); 2+ printf(mode == MEMORY ? "記憶: " : "検索: ");
投稿2020/06/30 18:56
編集2020/07/04 15:09総合スコア8224
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/30 19:11
2020/06/30 19:16
2020/06/30 19:18 編集
2020/06/30 19:19
2020/06/30 19:24 編集
2020/06/30 19:34
2020/06/30 20:27 編集
2020/06/30 20:38
2020/06/30 20:47
2020/06/30 23:13
2020/07/04 14:22 編集
2020/07/04 17:19
2020/07/06 05:27
2020/07/06 05:56
2020/07/06 06:06
2020/07/06 06:10
2020/07/06 06:17
2020/07/06 06:40
0
※ 回答ではありませんし、C実装でもありません。
暇つぶしに書いてみたんで、なにかのタシになれば。
C++
1#include <iostream> 2#include <fstream> 3#include <random> 4#include <string> 5#include <vector> 6 7/* fileで指定されたテキストファイル内の文字列の中から 8 wordを含む文字列を返す。 9 複数ある場合、そのうちいずれかを乱数を用いて返す。 10 存在しない場合/ファイルオープン失敗の場合、空文字列を返す。 11*/ 12std::string find_word(const std::string& file, const std::string& word) { 13 std::string result; 14 std::ifstream stream(file); 15 if ( stream.is_open() ) { 16 std::vector<std::string> lines; 17 std::string line; 18 // wordを含む文字列の集合をlinesに求める 19 while ( std::getline(stream, line) ) { 20 if ( line.find(word) != std::string::npos ) { 21 lines.push_back(line); 22 } 23 } 24 // linesが空でなければ、そのうちいずれかをデタラメに返す 25 if ( !lines.empty() ) { 26 std::random_device gen; 27 std::uniform_int_distribution<int> dist(0, lines.size()-1); 28 result = lines.at(dist(gen)); 29 } 30 } 31 return result; 32} 33 34int main() { 35 std::string word = "映画"; 36 for ( int i = 0; i < 10; ++i ) { 37 std::string result = find_word("d.txt", word); 38 if ( !result.empty() ) { 39 std::cout << word << " -> " << result << std::endl; 40 } 41 } 42}
d.txt:
ジュニーは戦場へ行くという映画は面白い。 明日は晴れ。 どすこいはお相撲。 映画館はどこも満席。 休日はおうちで映画鑑賞。
実行結果:
映画 -> ジュニーは戦場へ行くという映画は面白い。 映画 -> 休日はおうちで映画鑑賞。 映画 -> ジュニーは戦場へ行くという映画は面白い。 映画 -> 映画館はどこも満席。 映画 -> ジュニーは戦場へ行くという映画は面白い。 映画 -> 映画館はどこも満席。 映画 -> 映画館はどこも満席。 映画 -> 映画館はどこも満席。 映画 -> ジュニーは戦場へ行くという映画は面白い。 映画 -> 休日はおうちで映画鑑賞。
[追記] もっと簡単になるな...
C++
1#include <iostream> 2#include <fstream> 3#include <random> 4#include <string> 5 6/* fileで指定されたテキストファイル内の文字列の中から 7 wordを含む文字列を返す。 8 複数ある場合、そのうちいずれかを乱数を用いて返す。 9 存在しない場合/ファイルオープン失敗の場合、空文字列を返す。 10*/ 11std::string find_word(const std::string& file, const std::string& word) { 12 std::string result; 13 std::ifstream stream(file); 14 if (stream.is_open()) { 15 std::string line; 16 int count = 0; 17 std::random_device gen; 18 while (std::getline(stream, line)) { 19 if (line.find(word) != std::string::npos) { 20 ++count; 21 if ( std::bernoulli_distribution(1.0/count)(gen) ) result = line; 22 } 23 } 24 } 25 return result; 26} 27 28int main() { 29 std::string word = "映画"; 30 for (int i = 0; i < 10; ++i) { 31 std::string result = find_word("d.txt", word); 32 if (!result.empty()) { 33 std::cout << word << " -> " << result << std::endl; 34 } 35 } 36}
投稿2020/06/29 02:38
編集2020/06/30 06:48総合スコア16612
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/30 07:51
2020/06/30 08:01 編集
2020/06/30 08:01
2020/06/30 08:24 編集
2020/06/30 08:42 編集
2020/06/30 11:21
2020/06/30 11:28
2020/06/30 15:13 編集
2020/06/30 16:09
2020/06/30 16:14
2020/06/30 16:30
2020/06/30 16:30
2020/06/30 16:32
2020/06/30 16:39
2020/06/30 16:45
2020/06/30 16:48
2020/06/30 16:56
2020/06/30 17:06 編集
2020/06/30 17:16
2020/06/30 17:18
2020/06/30 17:25
2020/06/30 17:28
2020/06/30 17:33 編集
2020/06/30 17:35
2020/06/30 17:39
2020/06/30 17:46 編集
2020/06/30 17:50
2020/06/30 18:43 編集
2020/06/30 23:28 編集
2020/07/01 07:47 編集
2020/07/01 08:03
2020/07/01 08:27
2020/07/01 08:38 編集
2020/07/01 08:44
2020/07/01 09:48
2020/07/01 11:29
2020/07/01 12:27 編集
2020/07/01 12:43 編集
2020/07/01 12:53
2020/07/01 13:11
2020/07/01 22:48
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。