2015-08-29 71 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