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

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

新規登録して質問してみよう
ただいま回答率
85.48%
関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

422閲覧

C++ mainで関数を呼び出してリストと比較する方法

alice331

総合スコア11

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/07/06 02:09

ソースコード2を参考にして、1のソースコードを書き直したいと思っています。
アドバイスなど、ご教授いただければ幸いです。

参考にしたいソースコードは抜粋してきたため、分かりにくいかもしれませんがよろしくお願いします。

概要としては、コマンドラインで入力された引数引数とフォーマットとしてリストに入っている文字を比較して出力するソースコードです。

やりたい事:mainでCheck関数を呼び出せるようにしたいです。

c++

1/* 1,コマンドラインで入力された引数とリストの文字を比較するコード */ 2#include <iostream> 3#include <string> 4#include <sstream> 5#include <unordered_set> 6 7using namespace std; 8 9int main(int argc, char* argv[]) 10{ 11 /* 引数なしの場合、エラー表示 */ 12 if (argc < 2) 13 { 14 cout << "error : 引数がありません"; 15 return 1; 16 } 17 /* 使用可能な文字タイプ一覧 */ 18 /* 追加が発生した場合に追加する */ 19 unordered_set<string> chara_types = 20 { 21 "A", 22 "B", 23 "C" 24 }; 25 /* 引数を読み込む */ 26 istringstream iss(argv[1]); 27 for (string type; getline(iss, type, ',');) 28 { 29 if (chara_types.erase(type) != 1) 30 { 31 /* 文字タイプ一覧に存在しない場合 */ 32 cout << "error: 入力間違いです"; 33 return 2; 34 } 35 } 36 cout << "入力された文字 : " << argv[1]; 37 return 0; 38} 39

c++

1/* 2,参考にしたいコード Check関数 */ 2/* check_listはコマンドラインで入力された文字列です */ 3bool Check( std::string input, const char delimiter, std::vector<std::string>& chek_list ) 4{ 5 std::istringstream stream(input); 6 std::string field, result; 7 8 while (std::getline(stream, field, delimiter)) 9 { 10 auto result_find = std::find( check_list.begin(), chek_list.end(), field); 11 12 /* 引数に重複がある */ 13 if (result_find != check_list.end()) 14 { 15 printf("--check error. duplicate check-name=[%s]", field.c_str()); 16 return false; 17 } 18 // チェックリストに追加 19 check_list.push_back(field); 20 } 21 return true; 22} 23

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

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

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

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

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

guest

回答1

0

ベストアンサー

アドバイスなど、ご教授いただければ幸いです。

僕ならこうする:

C++

1#include <iostream> 2#include <string> 3#include <sstream> 4#include <set> 5#include <algorithm> 6 7bool Check(const std::string& input, const char delimiter, std::set<std::string>& check_list) { 8 std::istringstream stream(input); 9 std::string field, result; 10 std::set<std::string> input_list; 11 12 // delimiterを区切り文字として分割し、input_listに格納する 13 // 重複があれば失敗 14 while (std::getline(stream, field, delimiter) ) { 15 if ( !input_list.insert(field).second ) return false; 16 } 17 18 // input_listが空なら失敗 19 if ( input_list.empty() ) return false; 20 21 // check_listがinput_listを包含していれば成功 22 return std::includes(check_list.begin(), check_list.end(), 23 input_list.begin(), input_list.end()); 24} 25 26int main(int argc, char* argv[]) { 27 using namespace std; 28 29 /* 引数なしの場合、エラー表示 */ 30 if (argc < 2) { 31 cout << "error : 引数がありません"; 32 return 1; 33 } 34 35 /* 使用可能な文字タイプ一覧 */ 36 /* 追加が発生した場合に追加する */ 37 set<string> chara_types = { 38 "A", 39 "B", 40 "C" 41 }; 42 43 /* 引数を読み込む */ 44 if ( !Check(argv[1], ',', chara_types) ) { 45 cout << "error: 入力間違いです"; 46 return 2; 47 } 48 cout << "入力された文字 : " << argv[1]; 49 50 // おまけ: いくつかのテスト・ケース 51 for ( string arg : { "A,B,C", "A,B", "C,A", "C,B", "", ",,", "A,B,C,A", "A,C,D" }) { 52 cout << "arg: [" << arg << "] result:" 53 << boolalpha << Check(arg, ',', chara_types) << endl; 54 } 55 return 0; 56}

投稿2020/07/06 02:58

episteme

総合スコア16614

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

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

alice331

2020/07/06 14:21

ご回答ありがとうございます。 std::istringstream stream(input); std::string field, result; std::set<std::string> input_list; 上記の3つの意味を教えていただけますでしょうか? 調べてのですが、よく理解できませんでした。 よろしくお願いいたします。
episteme

2020/07/06 14:39

それぞれ、なにがわからんですか?
alice331

2020/07/06 15:52

std::istringstream stream(input); ==>コマンドラインから入力される引数という認識で合っていますでしょうか? std::string field, result; ==>field,result が指している内容がわかりません。 std::set<std::string> input_list; ==>check_listは引数の文字で input_listは何を指していますでしょうか? よろしくお願いいたします。
episteme

2020/07/06 16:17

> std::istringstream stream(input); > ==>コマンドラインから入力される引数という認識で合っていますでしょうか? コマンドラインから得られた文字列:input から作られたストリーム > ==>field,result が指している内容がわかりません。 field : コマンドラインから(delimiterで区切って)切り出された文字列 result : ごめん使ってないわ > input_listは何を指していますでしょうか? コマンドラインから(delimiterで区切って)切り出された文字列の集合から重複を取り除いたもの
alice331

2020/07/07 06:16

回答ありがとうございました。理解できました! もう一つよろしいでしょうか? if ( !input_list.insert(field).second ) return false; この一文で.secondは何を指しているのでしょうか?
episteme

2020/07/07 06:35

重複のため挿入に失敗したらfalseになるbool値。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問