如何从控制台读取密码,回显splats?

时间:2011-07-29 10:54:12

标签: c++ string

这里我已经编写了一个代码来接受用户在输入用户名后输入的密码,我已经使用do while语句编写了一个小代码,以便每当用户输入任何字符时打印出该星号,&当用户输入'!'时,循环终止。 但当我看到用户输入的密码时,它让我感到惊讶,&输入密码的字符串长度,STRING长度总是21,在我的情况下,&密码的输出是用户输入的密码的组合。用户名......发生了什么??????

#include<iostream.h>
#include<conio.h>
#include<string.h>
int main()
{
    char username[15],password[15];
    int i=0;
    cout<<"\nEnter your USERNAME:";
    cin>>username;
    cout<<"\nenter your password:";

    do 
    {
        password[i]=getch();


        if(password[i]=='!')break;
        cout<<"*";
        i++;
    }while(i<15);
    cout<<"\n\nthe password entered was"<<password<<"\nthe length of the password is"           <<strlen(password);
    getch();
    return 0;
} 

5 个答案:

答案 0 :(得分:2)

您已定义:

char password[15];

根据你的循环,它一直持续到i等于14(即第15个字符)。因此 NULL终止没有空间。让它像这样:

char password[16];

现在,在循环之后,添加:

password[i] = 0;
如果用户未输入“!”,则

i将位于15如果他这样做,它将被NULL字符替换。我认为这是最容易解决的问题。如果你不想要'!'要替换,请在i++;

之前放置break;

答案 1 :(得分:1)

您没有使用NULL终止字符串。

do 
{
    password[i]=getch();
    if(password[i]=='!') break;
    cout<<"*";-
    i++;
}while(i<15);
if (i < 15) password[i] = '\0';

答案 2 :(得分:1)

C字符串必须以特殊字符'\0'终止,而密码/用户名不是这种情况。您必须将i+1字符设置为'\0'

password[i]=getch();
password[i+1] = '\0';

此外,您还必须考虑您的密码缓冲区还必须包含此字符串,因此如果您定义char password[15];,则只有14个字符的空格,因此您的循环可以转到14。

答案 3 :(得分:1)

你读了15个字符,但你从不在字符串中写'\ 0',所以它不会被终止。

答案 4 :(得分:0)

#include <iostream>
#include <string>

请更正。如果您的编译器不知道这些文件,那么您的编译器就没有任何好处。

那么,为什么不使用std :: string代替char-arrays?
这样可以避免任何这些错误。 你在这里做的是c和c ++的混合。