未知字符被添加到字符串的最后

Unknown character is being added to the last of the string

下面是我用 C++ 设计的应用程序的一部分。下面的代码片段显示 *** 作为密码输入 user.The 代码在程序的两个地方使用,一个工作正常,另一个地方它在 enterdPassword 末尾显示未知字符。

工作正常here.the输入的密码保存在文件中以供进一步使用。

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]='[=10=]';
    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] = '[=11=]';

    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;}
}

程序图像运行。

我不明白为什么相同的代码(仅使用不同的变量)会产生不同的效果如何更正代码以使其按预期正确工作?

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

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

px[i]=='[=10=]'

你必须改变

p[i+1]='[=10=]';

p[i]='[=11=]';

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

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

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

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

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