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

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

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

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

Q&A

解決済

2回答

1330閲覧

C++ クラスについて

amareno

総合スコア20

C++

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

0グッド

1クリップ

投稿2018/11/09 08:51

編集2018/11/09 09:09

実現したいこと

現在try throw catchとクラスを用いてパスワード認識のプログラムをC++で作っています。
下記のようにエラーが発生します。
私のコードのどこがおかしいか教えていただけますでしょうか?

発生している問題・エラーメッセージ

Enter the password: buvuTGB3547& Your password is not valid. libc++abi.dylib: terminating with uncaught exception of type double Process finished with exit code 6

該当のソースコード

C++

1#include <iostream> 2#include <cstring> 3 4using namespace std; 5 6class PasswordError{ 7private: 8 bool aUpper = false, 9 aLower = false, 10 aDigit = false, 11 aPunct = false; 12 13public: 14 bool testNum(char pass[]) { 15 16 for (int i = 0; pass[i]; ++i) 17 if (isupper(pass[i])) 18 aUpper = true; 19 else if (islower(pass[i])) 20 aLower = true; 21 else if (isdigit(pass[i])) 22 aDigit = true; 23 else if (!ispunct(pass[i])) 24 aPunct = true; 25 if (aUpper && aLower && aDigit && aPunct) 26 return true; 27 else 28 return false; 29 } 30 31 void exception() { 32 try { 33 if (!aUpper) 34 throw 2; 35 } 36 37 catch (int a) { 38 cout << "Your password should contain at least one upper case" << endl; 39 } 40 41 try { 42 if (!aLower) 43 throw 4.5; 44 } 45 46 catch (double b) { 47 cout << "Your password should contain at least one lower case" << endl; 48 } 49 50 try { 51 if (!aDigit) 52 throw 'c'; 53 } 54 55 catch (char c) { 56 cout << "Your password should contain at least one numeric digit" << endl; 57 } 58 59 try { 60 if (!aPunct) 61 throw 1.5f; 62 } 63 64 catch (float d) { 65 cout << "Your password should contain at least one of these special characters: !@#$%&*:;" << endl; 66 } 67 } 68}; 69 70int main() { 71 PasswordError passw; 72 73 const int SIZE = 100; 74 char password[SIZE]; 75 76 cout << "Enter the password: " << endl; 77 cin.getline(password, SIZE); 78 79 80 try { 81 if (strlen(password) < 8) { 82 throw 4; 83 } 84 } 85 86 catch (int i) { 87 cout << " Your password must be at least 8 characters long." << endl; 88 } 89 90 91 if (passw.testNum(password)) 92 cout << "Your password is valid." << endl; 93 else { 94 cout << "Your password is not valid. " << endl; 95 passw.exception(); 96 97 return 0; 98 } 99}

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

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

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

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

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

guest

回答2

0

ベストアンサー

C++

try {
if (!aPunct)
throw 1.5;
}
catch (float d) {
cout << "Your password should contain at least one of these special characters: !@#$%&*:;" << endl;
}

単に1.5と書いてしまうと、double型のリテラルと見做されます。1.5fと書いてください。

ところで、これ例外を利用する意味はあるんです?

コメントを受けて

例外を利用せよ、ってのはおそらくそういう意味では無いです。
ついでに判定処理も手直しして書いてみました。

C++

1#include <algorithm> 2#include <cstring> 3#include <iostream> 4#include <string> 5 6class Password { 7public: 8 Password(const std::string& p) { 9 using namespace std::literals::string_literals; 10 11 if(p.size() < 8) { 12 throw "Your password must be at least 8 characters long."s; 13 } 14 if(!std::any_of(std::cbegin(p), std::cend(p), ::isupper)) { 15 throw "Your password should contain at least one upper case."s; 16 } 17 if(!std::any_of(std::cbegin(p), std::cend(p), ::islower)) { 18 throw "Your password should contain at least one lower case."s; 19 } 20 if(!std::any_of(std::cbegin(p), std::cend(p), ::isdigit)) { 21 throw "Your password should contain at least one numeric digit."s; 22 } 23 if(!std::any_of(std::cbegin(p), std::cend(p), ::ispunct)) { 24 throw "Your password should contain at least one of these special characters: !@#$%&*:; ."s; 25 } 26 } 27}; 28 29int main() { 30 try { 31 Password password{"buvuTGB3547&"}; 32 std::cout << "Your password is valid.\n"; 33 } 34 catch(const std::string& e_message) { 35 std::cerr << "Your password is not valid.\n" << e_message << "\n"; 36 } 37}

何かしら見落としや不勉強があるかもしれません。

投稿2018/11/09 08:57

編集2018/11/09 09:30
LouiS0616

総合スコア35658

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

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

amareno

2018/11/09 09:05

回答ありがとうございます。実は先日、例外を使わずにプログラムを完成させたのですが、現在問題を解いていて、問題文に例外とクラスを使用しろと書かれてあるので例外とクラスを使用しています。
LouiS0616

2018/11/09 09:08

testNumから直接例外を投げて、出力はmain関数に任せてしまった方がすっきりするのでは?
amareno

2018/11/09 09:24

すいません、testNumの中に例外を入れてそれをmain関数で呼び出すという意味でしょうか? もしよろしければ、もうすこし詳しく説明して頂けないでしょうか?
LouiS0616

2018/11/09 09:30

追記しました。
amareno

2018/11/09 09:54

ありがとうございます。コードを解読するのが難しそうですが、自分のコードと照らし合わせて頑張ってみます。
guest

0

単に1.5と書いた場合、それはdouble型の値となります。throw 1.5;catch(float e)では回収できません。

投稿2018/11/09 08:59

maisumakun

総合スコア145121

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

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

amareno

2018/11/09 09:08

なるほど、回答ありがとうございます。訂正します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問