0

我正在尝试制作一个简单的程序作为我所学知识的应用程序,我正在尝试制作一个从用户那里获取密码的程序,并且对于用户输入的每个字符,控制台中都会显示一个“*”并且当他按下回车键时,程序停止接收更多字符并再次显示密码,所以我使用一个字符串来存储每个字符

这是我的代码:...

#include <iostream>
#include <string>
#include <conio.h>

using namespace std;
    
int main(){
    int i=0;
    string password;
    char p;
    cout << "Password: ";
    do{
        p = getch();
        cout.put('*');
        password[i] = p;
        ++i;
    } while (p != '\n');
    cout << "Your password is : " << password;
return 0;
}

当我运行程序时,它仍然会占用字符并且永远不会停止

当我退出控制台窗口时,它也会显示如下消息:

那么解决方法是什么?!

提前致谢 :)

4

2 回答 2

1
  • 当您按 Enter 键时,将通过 读取而不是'\n'(LF) 而是(CR) 。'\r'getch()
  • 您正在访问字符串的元素而不分配它们。

尝试这个:

#include <iostream>
#include <string>
#include <conio.h>

using namespace std;
    
int main(){
    string password;
    char p;
    cout << "Password: ";
    do{
        p = getch();
        cout.put('*');
        password.push_back(p); // note: '\r' will also be appended
    } while (p != '\r');
    cout << "Your password is : " << password;
    return 0;
}
于 2020-08-01T22:50:34.783 回答
0

为了避免复制粘贴上面的代码,如果@MikeCat 代码不起作用,请使用 \r\n,因为 Windows 使用它来表示按下了回车键,而 Linux 和 Unix 使用 \n 来表示按下了回车键您还可以通过它们的 ASCII 代码值(十进制或十六进制)检查它们,对于 \n 为 10,对于 \r 为 13,对于 \r\n 为 0x0D0A。

所以你可以检查 - 如果你在 Windows 中,我假设 -

while (p != '\r\n'); 

或通过使用 ASCII 码尝试

while (p != 10); // \n

或者

while (p != 13); // \r

或者

while (p != 0x0D0A); // \r\n
于 2020-08-01T23:02:53.467 回答