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

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

新規登録して質問してみよう
ただいま回答率
85.50%
コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

C++

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

Q&A

解決済

3回答

5787閲覧

C++ コマンドライン引数が空白の判定方法を教えて下さい。

alice331

総合スコア11

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

C++

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

0グッド

0クリップ

投稿2020/06/30 05:52

編集2020/06/30 13:33

コマンドラインで引数を入力する際に空白を入力すると空白までの引数しか表示できません。
なので引数にスペース、空白を入力した場合にエラー表示をしたいのですがどうすればよろしいでしょうか?
引数が空白の場合の判定方法を教えてください。
よろしくお願いします。

C++

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

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

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

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

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

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

dodox86

2020/06/30 06:07

そもそもですが、いただいたソースコードの内容は理解されていますでしょうか。必要であれば「条件の追加」だけではなく、要望を満たせるように一部を書き換える必要があるはずです。
guest

回答3

0

上記の出力を下記のように出力したいです。
A,→エラー表示(カンマの後ろに引数がありません)

つまり文字列の末尾が','か否かを判別したいのかな?

C++

1std::string arg = argv[1]; 2if ( arg[arg.size()-1] == ',' ) { 3 末尾がカンマだぞ 4}

上記の出力を下記のように出力したいです。
A (スペース)B→エラー表示(組み合わせ選択の場合はカンマが必要です)

コマンドラインからのargv[]は空白で区切られます。
空白コミでargv[]に入っててほしいなら
"このように 引用符で 囲みます"

投稿2020/06/30 06:07

episteme

総合スコア16614

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

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

alice331

2020/06/30 06:13

コメントありがとうございます。 ご指摘の通り末尾がコンマかどうかの判定をしたいです。 よろしくお願いします。
episteme

2020/06/30 06:14

いやだから判定コード示してるやん
alice331

2020/06/30 09:06

申し訳ありません。気づきませんでした。 ありがとうございます。
guest

0

ベストアンサー

引数に空白を入力した場合、argc が 3以上になります。

$ ./a.out A,B の場合、argc=2, argv[1]="A,B"
$ ./a.out A B の場合、argc=3, argv[1]="A", argv[2]="B"
$ ./a.out "A B" の場合、argc=2, argv[1]="A B"

C++

1#include <iostream> 2#include <string> 3#include <sstream> 4#include <unordered_set> 5using namespace std; 6 7int main(int argc, char* argv[]) 8{ 9 if (argc < 2) { 10 cout << "error : 引数がありません\n"; return 1; 11 } 12 if (argc > 2) { 13 cout << "error : 空白は区切りに使えません\n"; return 2; 14 } 15 unordered_set<string> chara_types = { "A", "B", "C" }; 16 string s = argv[1]; 17 if (s.size() > 0 && s[s.size()-1] == ',') { 18 cout << "error : 入力間違いです\n"; return 3; 19 } 20 istringstream iss(argv[1]); 21 while (getline(iss, s, ',')) { 22 if (chara_types.erase(s) != 1) { 23 cout << "error: 入力間違いです\n"; return 4; 24 } 25 } 26 cout << "入力された文字 : " << argv[1] << "\n"; 27 return 0; 28}

投稿2020/06/30 16:52

kazuma-s

総合スコア8224

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

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

alice331

2020/07/06 01:09

とても丁寧な解説で理解することが出来ました。 ありがとうございます!! 勉強になりました(__)
guest

0

スペースで区切られてるのを判定したいなら、argcを見ればよろしい

投稿2020/06/30 06:15

y_waiwai

総合スコア87719

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

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

alice331

2020/06/30 09:35

コメントありがとうございます。 argcを見るのはわかりました。 ただどこにどのようにif文を入れればよいでしょうか?
y_waiwai

2020/06/30 21:59

コマンドライン引数は、スペースで区切られた文字列が分割されてargvに入れられ、分割した数がargcに入れられます なので、スペースで区切られた引数は分割されますんで、argcは3あるいはそれ以上となります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問