2015-06-28 97 views
0

下面是我在C++中设计的应用程序的一部分。下面的代码片段显示***为用户输入的密码。在程序中的两个地方使用代码,一个工作正常,另一个地方在enterdPassword的末尾显示未知字符。将未知字符添加到最后一个字符串

这里工作正常。输入的密码保存在文件中以备后用。

if(FirstRun()){ 
    display_welcome_text_first_run(); 

    cout<<"\nEnter A Password(Max 13 character): "; 
    for(i=0; i<13; i++){ 
     x = getch(); 
     if(x == '\r'){ break; } 
     putchar('*'); 
     p[i]=x; 
    } 

    p[i+1]='\0'; 
    string pwd(p); 
    ofstream o(PASSWORD_FILE,ios::binary); 
    o <<pwd<<endl; 
    o.close(); 

这显示错误它示出了在enterdPassword末端的未知字符。

bool verifyPassword(){ 
    string savdPassword; 
    char px[20], x; 
    int i; 
    cout<<"Enter Your Password To Continue: "; 

    for(i=0; i<13; i++){ 
     x = getch(); 
     if(x == '\r'){ break; } 
     putchar('*'); 
     px[i] = x; 
    } 
    px[i+1] = '\0'; 

    string enterdPassword(px); 

    ifstream pp(PASSWORD_FILE, ios::binary); 
    pp>>savdPassword; 
    pp.close(); 
    cout<<endl<<enterdPassword;<<" "<<savdPassword; //for debugging 
    if(enterdPassword == savdPassword){ 
     return true; 
    } 
    else{return false;} 
} 

程序运行的图像。 Image of program run.

我不明白为什么相同的代码(只有不同​​的变量)给予不同的工作如何纠正代码以正确工作?

+0

我认为,在这两种情况下,'px [i + 1] ='\ 0';'应该是'px [i] ='\ 0';'。 –

+0

好吧,让我检查 – Pushkar

回答

5

你必须改变

p[i+1]='\0'; 

p[i]='\0'; 

因为i在上次循环迭代后已被递增。

然而,最好不要在所有使用的原始字符数组:

string pwd; 
for(i=0; i<13; i++){ 
    x = getch(); 
    if(x == '\r'){ break; } 
    pwd += x; 
} 
+0

这确实解决了我的问题,但我仍然不明白为什么第一次执行没有出错 – Pushkar

+0

@Pushkar在第一个函数中,你可以用零初始化(偶然或者它是一个全局/静态变量) –

+0

nope它只是在初始化的情况下,在案例1中。 – Pushkar

4

考虑x =='\ r'的情况。这里没有存储i px [i]的值。您将'\ 0'字符存储在第i + 1个位置。

您应该将此更改为px [i](对于输入\ r的i)会给出正确的字符。

px[i]=='\0' 
2

为了简单起见假设你输入一个字母的密码(不不管它是什么)。

您输入循环,变量i等于0。然后循环迭代,并且i增加到1,并且您阅读换行符(或更确切地说'\r')并且您跳出循环,i等于1。然后,您终止字符串i + 1,因此您将终止符设置为px[2],超出输入字符串的长度。

相关问题