2017-03-31 7 views
-1

誰かが私のコードが悪いかどうかを調べることができますか?コマンドを実行すると、コマンドプロンプトがクラッシュします。 私のC++のプログラムは、私のコードが悪いですか?

私はこのセクションに問題を絞り込む:

string result = ""; 
    result = pwpasst (username, password, "admin", "123"); 
    result = pwpasst (username, password, "root", "456"); 
    result = pwpasst (username, password, "peter", "789"); 

は、私は動作しているよう3つの機能のうちの2をコメントアウトした場合。 + コードが悪いのか、コマンドプロンプトに問題があるのか​​分かりません。コードの

残り:

#include <iostream> 

using namespace std; 

    string pwpasst (string username, string password, string un, string pw){ 
     if (username == un && password == pw) 
     { 
      return "You are logged in!"; 
     } 
    }; 

int main() 
{ 
    string username; 
    string password; 

    cout << "Enter your username: "; 
    cin >> username; 

    cout << "Enter your password: "; 
    cin >> password; 


    string result = ""; 
    result = pwpasst (username, password, "admin", "123"); 
    result = pwpasst (username, password, "root", "456"); 
    result = pwpasst (username, password, "peter", "789"); 

    if (result != "You are logged in!"){ 
     cout << "Wrong password or username!"; 
    } else { cout << result;} 
} 
+5

'pwpasst 'を通るすべてのパスが値を返すわけではありません。 –

+4

'(username == un && password == pw)'がfalseと評価された場合、未定義の動作が呼び出されます。 – George

+2

予防策として、 '-Wall'のようなオプションをつけてコードをコンパイルしてください。この場合、' warning:制御は非void関数の終わりに達します。 ' –

答えて

1

pwpasst()「...あなたは」

を文字列を返すかもしれませんが、else句が欠落していると何も、論理エラーが返されません。 あなたの関数は、それが約束した文字列を常に返すべきです。

前回は、1回または2回のエラーメッセージが毎回出力されるため、適切ではありません。


このコードスニペットでは、3つの割り当てが常に実行されます。

string result = ""; 
result = pwpasst (username, password, "admin", "123"); 
result = pwpasst (username, password, "root", "456"); 
result = pwpasst (username, password, "peter", "789"); 

あなたは、あなたが結果を得るとき、次のようなものを壊したく(これはどちらか良い選択ではありません):

string result = ""; 
do { 
    result = pwpasst (username, password, "admin", "123"); 
      if(result.size()) break; 
    result = pwpasst (username, password, "root", "456"); 
      if(result.size()) break; 
    result = pwpasst (username, password, "peter", "789"); 
      if(result.size()) break; 
}while(0); 

はおそらく、この中にエラーメッセージを配置する必要がありますスニペット、機能ではありません。

ロジックを変更する必要があります。おそらく、関数はbool(有効な名前/ pwを示すかどうかを示す)を返す必要があります。文字列 'result'は関数が参照するために渡されます。

+0

私の典型的なオプション:-ggdb -std = C++ 14 -Wall -Wextra -Wshadow -Wonon-virtual-dtor -pedantic -Wcast-align -Wcast-qual -Wconversion -Wpointer-arith - Wunused - オーバーロード - 仮想 –

+0

あなたの助けてくれてありがとう – Yannic

1

if (username == un && password == pw)がfalseで、そしてあなたの関数の定義によって、string値は最後に関数によって返される必要がある場合は、return文が欠落しています。これは未定義の動作を引き起こし、プログラムがランタイムエラーで終了する原因となります。

+0

注:あなたには他の論理エラーがありますプログラム。あなたの質問はそれらに関係しないので、私はここにそれらを含めていません。さらなる質問がある場合は、コメント欄に私に尋ねることができます。 –

+0

あなたの助けてくれてありがとう – Yannic

関連する問題