質問: c++で指定文字列のカウント方法(テキストマイニング) 大学でc++ builder を使った授業を受けておりましたが、いつも早く終わっていた(教科書を写すだけなのでタイピングが早ければすぐ終わる)のをc++が得意と勘違いされ、試験を免除する代わりにテキストマイニングに関連するソフトを作るという課題を言い渡されました。 テキストマイニングの意味は大体理解し、掲示板などからとってきたテキストデータの中にある「美味しい」と「不味い」の文字列の個数を数え上げるプログラムを作ろうと考えていますが、やり方が全くわかりません。授業では「学生のためのc++builder」という主に数値計算を扱った教科書の例題を実行するというもので、テキストデータの扱い方はほぼまったくしていません。 今までにやった中でファイルを扱ったようなものとしては void __fastcall tform1::button1click(tobject *sender) { opendialog1->execute(); //入力ファイル用ストリームのオブジェクト(fin)を生成する ifstream fin; fin.open(opendialog1->filename.c_str()); //エラー対策 if(!fin){ showmessage("ファイルのオープンに失敗しました!!"); exit(1); } double sintyo; char name[20]; //ファイルから氏名、身長データを読み込む fin>>name>>sintyo; while(!fin.eof()){ stringgrid1->cells[0][n]=(string)name; stringgrid1->cells[1][n]=formatfloat("###0.0",sintyo); data[n]=sintyo; n++; fin>>name>>sintyo; } fin.close(); } だけであり、それを元にして改良するということができそうにありません。 最初からチェックしていって、「美味い」など指定文字列があればdに1を加えるなど、アルゴリズムを考えること自体はできるとは思います。 しかも期限は一週間となっています。 どなたか方法をお教えいただけませんでしょうか。
回答: # そのまま提出しても質問攻めを喰らうでしょう /* * 標準入力から得られた文字列から * "美味しい"と"不味い"を検索し * それぞれの個数を出力する */ #include #include #include int count_str(const std::string& source, const std::string& target) { std::string src(source); int result = 0; std::string::size_type pos; while ( (pos = src.find(target)) != std::string::npos ) { ++result; src.erase(0, pos+target.size()); } return result; } int main() { std::ostringstream ostream; ostream << std::cin.rdbuf(); std::string source = ostream.str(); std::string target; target = "美味しい"; std::cout << "contains " << count_str(source, target) << " of " << target << std::endl; target = "不味い"; std::cout << "contains " << count_str(source, target) << " of " << target << std::endl; }