未知字符将添加到字符串的最后一个

Pus*_*kar 0 c++ string raw-input

下面是我用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();
Run Code Online (Sandbox Code Playgroud)

这里显示了它在结尾处显示未知字符的错误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;}
}
Run Code Online (Sandbox Code Playgroud)

程序运行的图像. 程序运行的图像.

我不明白为什么相同的代码(只有不同​​的变量)给出不同的工作如何根据需要纠正代码才能正常工作?

Ant*_*vin 5

你必须改变

p[i+1]='\0';
Run Code Online (Sandbox Code Playgroud)

p[i]='\0';
Run Code Online (Sandbox Code Playgroud)

因为i在最后一次循环迭代后已经增加了.

但是,最好不要使用原始字符数组:

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