2015-02-06 133 views
1

我似乎無法弄清楚爲什麼get_password函數調用總是會返回qwert,無論我傳入函數的字符串是什麼。我的問題是我無法看到這個函數中字符串比較出了什麼問題。比較函數調用返回的字符串

string get(string askfor, int numchars, string input) 
{ 
    cout << askfor << "(" << numchars << " characters): "; 
    cin >> input; 
    return input; 
} 

string get_password(string name) 
{ 
    string pwd; 
    if (name == "botting"){ 
     pwd = "123456"; 
    } 
    else if (name == "ernesto") { 
     pwd = "765432"; 
    } 
    else if (name == "tong") { 
     pwd = "234567"; 
    } 
    else { 
     pwd = "qwert"; 
    } 

    return pwd; 
} 

int main() 
{ 
    string name; 
    string pwd; 
    string passwd; 
    cout << "Address of name =" << &name << "\n"; 
    cout << "Address of pwd =" << &pwd << "\n"; 
    cout << "Address of passwd =" << &passwd << "\n"; 

    bool authenticated = false; 
    while (!authenticated) 
    { 
     // call one 
     string name1 = get("Name", 7, name); 
     cout << "call one returned: " << name1 << endl; 

     // call two 
     string pass1 = get_password(name); 
     cout << "call two returned: " << pass1 << endl; 

     //call three 
     string pass2 = get("Password", 7, passwd); 
     cout << "call three returned: " << pass2 << endl; 

     // compare the two passwords 
     authenticated = false; 
     if (pass1 == pass2) { 
      cout << "Welcome " << name << "\n"; 
      authenticated = true; 
     } 
     else { 
      cout << "Please try again\n"; 
     } 
    } 

    return 0; 
} 
+0

代碼混淆'name1'用'name' – tofi9 2015-02-06 03:10:10

回答

1

name1第二個呼叫:

// call one 
    string name1 = get("Name", 7, name); 
    cout << "call one returned: " << name1 << endl; 

    // call two 
    string pass1 = get_password(name1); // change this variable 
    cout << "call two returned: " << pass1 << endl; 

get()返回名稱name1字符串,並且不更新name變量本身,因爲這name仍然空字符串。

0

那是因爲你從來沒有分配任何東西name。它被初始化爲"",並且永遠不會改變。由於這與get_password中的任何案例都不匹配,因此它總是屬於else的情況,這將產生"qwert"

我認爲這個問題是,你的get功能將得到更好的這樣寫:

string get(string askfor, int numchars) 
{ 
    string input; // input shouldn't be an argument 
    cout << askfor<<"("<<numchars<<" characters): "; 
    cin >> input; 
    return input; 
} 

而且你可以使用結果是分配到name

name = get("Name", 7); 
+0

我試圖函數內聲明的名字和分配這一點,但該程序仍下落的最後一個else語句串get_password(字符串nameParam) { \t字符串PWD; \t string name = nameParam; \t if(name ==「botting」){ \t \t pwd =「123456」; \t} \t else if(name ==「ernesto」){ \t \t pwd =「765432」; \t} \t else if(name ==「tong」){ \t \t pwd =「234567」; \t} \t else { \t \t pwd =「qwert」; \t} \t return pwd; } – 2015-02-06 02:56:01

+0

@MbusiHlatshwayo你試過我的建議嗎?然後調用'get_password(name)'?在調用'get_password'來驗證之前,打印'name'的值。 – Barry 2015-02-06 03:03:04

0

你只需要通過參考而不是

string get(string askfor, int numchars, string &input) 
{ 
    cout << askfor << "(" << numchars << " characters): "; 
    cin >> input; 
    return input; 
}