2015-08-29 87 views
-1

我創建了一個程序,可以從用戶那裏獲取密碼。用戶還可以通過將原始密碼保存在字符串中,然後將舊密碼保存在新字符串中來更改密碼,但如果兩者都匹配,則用戶可以輸入新密碼,但即使我在新字符串和舊字符串中都輸入了相同的密碼,if語句不返回true並且密碼不會更改。 2,當我輸入密碼並按回車鍵時,輸入也存儲在密碼中。 這是我的代碼C++ - 我的密碼程序沒有更改密碼

void password(int n) 
{ 
    string pass = "0", oldpass = "0"; 
    char ch = '0'; 
    if (n) 
    { 
     cout << "Enter Old Password: "; 
     ch = _getch(); 
     while (ch != '\r') 
     { 
      oldpass.push_back(ch); 
      cout << "*"; 
      ch = _getch(); 
     } 
     cout << "Password is " << oldpass << endl; 
     if (oldpass == pass) 
     { 
      cout << "Enter New Password: "; 
      ch = _getch(); 
      while (ch != '\r') 
      { 
       pass.push_back(ch); 
       cout << "*"; 
       ch = _getch(); 
      } 
     } 
     else 
     { 
      cout << "\nPassword Does Not Match" << endl; 
      system("pause"); 
     } 
    } 
    else 
    { 
     cout << "No Password Found. Enter New Password... "; 
     ch = _getch(); 
     while (ch != '\r') 
     { 
      pass.push_back(ch); 
      cout << "*"; 
      ch = _getch(); 
     } 
     cout << "Password is " << pass<<endl; 
     cout << "\nPassword Saved Successfully" << endl; 
     system("pause"); 
    } 
} 

回答

0

回車沒有存儲在您的密碼中。

您的默認初始化爲「0」,並且最終會拋棄您。從空字符串開始。

此外,您永遠不會重置任一密碼的值,都會使用string.push_back(char)附加每個調用。並且請記住,函數中的變量不會保留,所以之後對函數的每次調用都會將變量默認爲其初始化值。

一個好的調試方法是在提示輸入舊密碼時顯示兩個字符串的值;你會看到每次調用函數都會默認兩個字符串都爲「0」,如果你在函數中使用循環,每個循環都會在字符串中附加更多字符,而不是用字符串覆蓋字符串,重新期待。

基本上,在某個點上,無論是在任何一個字符串的賦值之前還是之後,在重用它們之前,必須擦除字符串中的前一個值。

+0

明白了非常感謝。只有一件事是聲明一個字符串而不是初始化它,使它成爲一個空字符串。我認爲它有一個垃圾值? – SAIFI369

+0

字符串不是基本的數據類型:int,float,double,char等。字符串是一個類並處理c樣式字符串不包含的異常。所以不行,如果你不初始化一個String對象,它會將它的默認大小計數設置爲0,不會包含任何字符,並且會處理對自身的調用。而c樣式的字符串,是一個字符數組,並且將設置字符的內存等於它的大小,而不管內存是否被初始化。 – Dalphat

+0

好的,我明白,你說什麼每回呼功能? – SAIFI369