论坛首页· 友情链接申请·申请版主· 广告投放· 道具中心· 设为首页· 收藏本站
发新话题
打印

控制台下的密码输入问题

控制台下的密码输入问题

让输入的密码显示为*(或其他字符)。

string GetKey()
{
  cout<<"password: " ;
  string str;
  char ch;
  int i=0;
  cout.flush();//清空输出缓存
  ch=getch();
  while(ch!=13)//输入完成
  {
   if(ch!=8)
   {
    str[i++]=ch;
    cout<<'*';
    cout.flush();
    ch=getch();
   }
  
   else    //backspace,修改输入

   {
    cout<<"\b \b";
    i--;
    ch=getch();
   }   
  }
  str[ i ]=0;//字符串结束标志。
  return str;   
}

注:getch()函数位于 “conio.h”头文件
       要使用string还是c风格字符串可随意,大致思路就是这样

[ 本帖最后由 大道至简 于 2008-6-13 22:35 编辑 ]

TOP

控制台下密码输入时也可以不显示
不错,收下thanks

TOP

hehe

:hug:

TOP

楼主这段代码很乱,有错误,比如str[i++]=ch;这两句是非法的,因为str中没有元素,貌似是楼主想用char 数组

下面是我按楼主思路写的
#include <iostream>
#include <string>
#include <conio.h>

using namespace std;

void GetKey(string &str);

int main()
{
    string str_key ;
    GetKey(str_key);
    cout << '\n' << str_key << endl;
    system("pause");
    return EXIT_SUCCESS;
}

// I think forcing the buffer to be processed after each insertion may not be necessary
void GetKey(string &str)
{
   string::iterator i_str;
   cout << "password: " ;
   char ch;
   while((ch = getch()) != '\r')  {
       if(ch != '\b'){   
             str += ch;
             cout <<'*';
   }  
   else{        //backspace,modify the string
    i_str = str.end()-1;
    //we can never use the elements before the one str.begin() points to
    if ( i_str != (str.begin()-1)) {
       cout << "\b \b";  
       str.erase(i_str);
       }
    else
       continue;   
   }   
  }         
}
Dev C++ 4.9.9.2,Borland C++5.5编译通过,我没有VC,所以没试

TOP

回复 4# 的帖子

非常感谢楼上。
代码是很混乱,因为在不同的项目中用过,被改了几次,其中确实有一次用char数组。
另外,对于string数据结构,其用法是很随意的,我们不用管它的内存是怎么分配的。我第一次就是用string写出这个函数来的。[ ]是string中重载的运算符,那个用法是可以的。
Thanks for your work!

TOP

回复 5# 的帖子

你说的对,但是你用下标访问string中的元素的时候是不能越界的,因为string的下标操作符不会分配新的空间。
在你的代码中string str;仅仅是调用默认构造函数定义了一个空的string类型变量,里面没有任何元素,所以当执行str[i++]=ch;时就是越界,编译器不会检查是否越界,但是运行时会有问题

TOP

回复 6# 的帖子

非常感谢。
我试了一下,确实存在这个问题。我一直以为c++自己的string是有越界检查的,具体怎样,我再来看看《The c++ programming language》。

另外,我发的时候,系统还有点问题,所以缩进显示不出来。还有个bug,[ ]中间的变量为i时,三个字符会一起消失。所以我用j为变量重写了一遍,并经过测试。也发上来放这吧。

再次感谢。

void GetKey(char* str)
{
          cout<<"password: " ;
          
          char ch;
          int j=0;
          cout.flush();//清空输出缓存
          ch=getch();
          while(ch!=13)//输入完成
          {
                   if(ch!=8)//backspace,修改输入
                   {
                                str[j++]=ch;
                                cout<<'*';
                                cout.flush();
                                ch=getch();
                   }
  
                   else
                   {
                                cout<<"\b \b";
                                j--;
                                ch=getch();
                   }   
          }
          str[j]=0;//字符串结束标志。          
}

TOP

发新话题