2017-03-31 47 views
-1

有人可以檢查我的代碼是否壞?當我執行它時,我的命令提示符崩潰。我的C++程序不斷崩潰ist我的代碼不好?

我將問題範圍縮小到本節:

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

如果我註釋掉2出的3個功能似乎工作。 + 我不知道我的代碼是壞的還是我的命令提示符有問題。

的其餘代碼:

#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,則調用undefined-行爲。 – George

+2

作爲一種預防措施,你應該編譯你的代碼,總是帶有諸如'-Wall'這樣的選項,在這種情況下會給你一個警告,例如'warning:控制到達非空函數結束' –

回答

1

pwpasst()可能返回字符串「你是......」

但else子句缺失,不返回任何,一個邏輯錯誤。 你的函數應該總是返回它承諾的字符串。

string pwpasst (string username, string password, string un, string pw) 
{ 
    if (username == un && password == pw) 
    { 
     return "You are logged in!"; 
    } 
    else 
    { 
     // perhaps - but not a good choice. 
     std::cerr << "unknown user name or password" << std::endl; 
     return ""; // return null string 
    } 
}; 

不是一個好的選擇,因爲以前每次都會輸出1或2條錯誤消息。


在這個代碼片段中,三個賦值將始終執行。

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 -Wnon-virtual-dtor -pedantic -Wcast-align -Wcast-qual -Wconversion -Wpointer-arith - Wunused -Woverloaded-virtual –

+0

非常感謝您的幫助 – Yannic

1

您缺少return語句,如果if (username == un && password == pw)是假的,和你的函數定義,string值需要在其結尾的函數返回。這會調用未定義的行爲,這會導致程序以運行時錯誤終止。

+0

注意:你的邏輯錯誤程序。由於你的問題不屬於他們,我沒有把它們包括在這裏。如果您還有其他問題,可以在評論欄中提問。 –

+0

非常感謝您的幫助 – Yannic