请问C++如何在控制台中设置输入为*号?
本帖最后由 高山 于 2023-1-2 17:08 编辑大佬们,不是道如何让在控制台中设置输入为*号?
我从网上搜了的都不符合我的代码
我的代码(请不要侵权):
#include"allinclude.h"
using namespace std;
string vname;
map <string,int> a;
map <string,int> huser;
map <string,string> vhuser;
double ch,yuan;
double zj;
string name;
int pass;
char yesno='n';
void start()
{
system("color 7C");
cout<<"----------欢迎来到商家系统 V3.0----------"<<endl;
cout<<"在使用本系统之前,您需要阅读以下几点:"<<endl;
cout<<"1.本系统的更新请关注fishc.com.cn中高山的发帖"<<endl;
cout<<"2.本程序是您的商家助理,但本程序没有存储功能,请不要在未记录数据前进行关闭程序"<<endl;
cout<<"3.本程序是万能版,适用所有系统"<<endl;
cout<<"↑以上就是本程序的信息了"<<endl;
system("pause");
system("cls");
}
void vspeak()
{
cout<<"在使用本程序前,务必仔细查看使用说明"<<endl;
cout<<"程序作者:高山"<<endl;
cout<<"发布机构:鱼C论坛"<<endl;
cout<<"程序版本:V3.0"<<endl;
cout<<"更新链接:高山账户"<<endl;
system("pause");
system("cls");
}
void hello()
{
cout<<"\n\
@\n\
/ \\\n\
* *\n\
* *\n\
* *\n\
* * * * * *\n\
* * * * * * * *\n\
* * * * * * * * * *\n\
* *\n\
* *\n\
* * * *\n\
* * * * * *\n";
cout<<"正在启动..."<<endl;
Sleep(200);
system("cls");
}
void clac()
{
system("color 2F");
system("cls");
char ch;
double number=0,doing;
cout<<"欢迎您使用计算系统,为了保证计算的快速,将使用自动读取功能,第一步时无需按下回车"<<endl;
while(true)
{
cout<<"请问您要进行什么操作?"<<endl;
cout<<"1.加法 2.减法 3.乘法 4.除法 5.结束"<<endl;
ch=getch();
if(ch=='1')
{
cout<<"请输入加的数量:";
cin>>doing;
number+=doing;
cout<<"完成!"<<endl;
system("pause");
system("cls");
}
if(ch=='2')
{
cout<<"请输入减的数量:";
cin>>doing;
number-=doing;
cout<<"完成!"<<endl;
system("pause");
system("cls");
}
if(ch=='3')
{
cout<<"请输入乘的数量:";
cin>>doing;
number*=doing;
cout<<"完成!"<<endl;
system("pause");
system("cls");
}
if(ch=='4')
{
cout<<"请输入除的数量:";
cin>>doing;
number/=doing;
cout<<"完成!"<<endl;
system("pause");
system("cls");
}
if(ch=='5')
{
cout<<"结果是"<<number<<endl;
system("pause");
system("cls");
system("color 7A");
return ;
}
}
}
void store()
{
system("cls");
cout<<"欢迎来到商品管理系统"<<endl;
cout<<"请输入商品名称:";
cin>>name;
cout<<"请输入商品价格:";
cin>>yuan;
if(yuan==0)
{
cout<<"价格不能为空哦~"<<endl;
system("pause");
system("cls");
}
else
{
a=yuan;
system("pause");
system("cls");
}
}
void vfind()
{
system("cls");
cout<<"欢迎进入商品查价系统!"<<endl;
cout<<"请输入需要查找的商品名称:";
cin>>name;
if(a==0)
{
cout<<"商品不存在哦~"<<endl;
a=yuan;
system("pause");
system("cls");
}
else
{
cout<<"名称为 "<<name<<" 的价格为 "<<a<<" 元"<<endl;
system("pause");
system("cls");
}
}
void vdel()
{
system("cls");
char choose;
string vname;
system("color 4F");
cout<<"您已经进入商品删除系统,删除后无法恢复,确认操作(y/n):";
cin>>choose;
if(choose=='y')
{
cout<<"请输入需要删除的商品:";
cin>>vname;
if(a==0)
{
cout<<"删除失败!商品不存在"<<endl;
system("pause");
system("cls");
system("color 7C");
return;
}
a=0;
cout<<"删除成功!"<<endl;
system("pause");
system("cls");
system("color 7C");
return;
}
if(choose=='n')
{
system("color 7C");
return ;
}
}
void yuanwrite()
{
system("cls");
char choose;
double lsyuan;
cout<<"欢迎使用智能账本功能!"<<endl;
while(true)
{
cout<<"请输入目前是收入/支出/查看价格/退出智能账本(命令为:s/z/f/e):";
cin>>choose;
if(choose =='s')
{
cout<<"请输入收入价格:" ;
cin>>lsyuan;
zj+=lsyuan;
cout<<"成功!"<<endl;
system("pause");
system("cls");
}
else if(choose =='z')
{
cout<<"请输入支出价格:";
cin>>lsyuan;
zj-=lsyuan;
if(zj<0)
{
cout<<"余额为负数,余额为"<<zj<<"元"<<endl;
}
system("pause");
system("cls");
}
else if(choose=='f')
{
cout<<"您的余额为"<<zj<<"元"<<endl;
system("pause");
system("cls");
}
else if(choose=='e')
{
cout<<"感谢使用!现在返回首页"<<endl;
system("pause");
system("cls");
return ;
}
}
}
void close()
{
system("color 4F");
system("cls");
char choose;
cout<<"确定关闭本系统?关闭后包括账本、商品的数据都会丢失!"<<endl;
cout<<"请问是否关闭(y/n):";
cin>>choose;
if(choose == 'y')
{
cout<<"正在操作中..."<<endl;
system("pause");
exit(0);
}
else
{
system("color 7C");
return ;
}
}
void word()
{
system("cls");
int choose;
string vword;
cout<<"---------------------意见反馈内容---------------------"<<endl;
cout<<"1.管理不当2.发现bug3.发展建议4.其他反馈"<<endl;
cout<<"请输入您的选择:";
cin>>choose;
if(choose==1)
{
cout<<"请输入具体内容,不支持多行文本:";
cin>>vword;
cout<<"请复制以下内容通知高山(系统不支持复制请右键点击程序标题,点击选择,复制):"<<endl;
cout<<"意见反馈表"<<endl;
cout<<"编号:1类型:管理不当版本:万能2.0"<<endl;
cout<<"具体内容:"<<vword<<endl;
cout<<"下面按下任意键后关闭"<<endl;
system("pause");
system("cls");
return ;
}
if(choose==2)
{
cout<<"请输入具体内容,不支持多行文本:";
cin>>vword;
cout<<"请复制以下内容通知高山(系统不支持复制请右键点击程序标题,点击选择,复制):"<<endl;
cout<<"意见反馈表"<<endl;
cout<<"编号:2类型:发现bug版本:万能2.0"<<endl;
cout<<"具体内容:"<<vword<<endl;
cout<<"下面按下任意键后关闭"<<endl;
system("pause");
system("cls");
return ;
}
if(choose==3)
{
cout<<"请输入具体内容,不支持多行文本:";
cin>>vword;
cout<<"请复制以下内容通知高山(系统不支持复制请右键点击程序标题,点击选择,复制):"<<endl;
cout<<"意见反馈表"<<endl;
cout<<"编号:3类型:发展建议版本:万能2.0"<<endl;
cout<<"具体内容:"<<vword<<endl;
cout<<"下面按下任意键后关闭"<<endl;
system("pause");
system("cls");
return ;
}
if(choose==4)
{
cout<<"请输入具体内容,不支持多行文本:";
cin>>vword;
cout<<"请复制以下内容通知高山(系统不支持复制请右键点击程序标题,点击选择,复制):"<<endl;
cout<<"意见反馈表"<<endl;
cout<<"编号:4类型:其他反馈版本:万能2.0"<<endl;
cout<<"具体内容:"<<vword<<endl;
cout<<"下面按下任意键后关闭"<<endl;
system("pause");
system("cls");
return ;
}
}
void systemclose()
{
system("cls");
system("color 4F");
char choose;
cout<<"确定关闭本电脑?关闭后包括账本、商品的数据都会丢失!"<<endl;
cout<<"请问是否关闭(y/n),输入操作前请保存未保存的工作:";
cin>>choose;
if(choose == 'y')
{
system("pause");
system("shutdown -s -t 10");
}
else
{
system("color 7C");
return ;
}
}
void vsay()
{
system("cls");
cout<<"程序版本:万能系统版V3.0"<<endl;
cout<<"更新日志:"<<endl;
cout<<"-修复了部分bug"<<endl;
cout<<"-增加了账户功能"<<endl;
cout<<"-设置了账户的用户组"<<endl;
cout<<"-其他关于账户的功能"<<endl;
system("pause");
system("cls");
}
void newuser()
{
system("cls");
string uname;
int upass,choose;
cout<<"您已经进入账户管理系统"<<endl;
cout<<"请输入想要添加的用户名(谨慎起名,目前不支持修改账户昵称):";
cin>>name;
cout<<"请输入 "<<name<<" 的密码(密码不能设置为0,否则无效):";
cin>>upass;
cout<<"请输入 "<<name<<" 的用户组"<<endl;
cout<<"1.管理团队 2.VIP用户 3.普通用户 4.禁止访问"<<endl;
cout<<"您的选择是:";
cin>>choose;
huser=upass;
if(choose==1) vhuser="管理团队";
if(choose==2) vhuser="VIP用户";
if(choose==3) vhuser="普通用户";
if(choose==4) vhuser="禁止访问";
cout<<"新建成功!"<<endl;
system("pause");
system("cls");
}
void vdeluser()
{
int yn2;
string vname;
system("cls");
system("color 4F");
cout<<"您已进入账户删除系统"<<endl;
cout<<"是否开始删除(是选择1,不是选择2):";
cin>>yn2;
if(yn2==2)
{
system("color 7C");
return ;
}
cout<<"请输入需要删除的用户名:";
cin>>vname;
if(huser==0)
{
cout<<"账户不存在!"<<endl;
system("pause");
system("cls");
return ;
}
huser=0;
vhuser="无效";
cout<<"删除成功!"<<endl;
system("pause");
system("cls");
system("color 7C");
}
void aduser()
{
int ch1,newpass;
system("cls");
string vhname,newname;
cout<<"欢迎进入账户管理系统"<<endl;
cout<<"请输入需要管理的账户:";
cin>>vhname;
if(huser==0)
{
cout<<"账户不存在!"<<endl;
system("pause");
system("cls");
return ;
}
cout<<"账户名称:"<<vhname<<endl;
cout<<"账户密码:"<<huser<<"账户权限:"<<vhuser<<endl;
cout<<"操作:"<<endl;
cout<<"1.修改昵称 2.修改密码 3.设为管理"<<endl;
cout<<"4.设为特权 5.设为普通 6.禁止访问"<<endl;
cout<<"7.不操作"<<endl;
cout<<"请输入您的选择:";
cin>>ch1;
if(ch1==1)
{
cout<<"由于用户名混乱,本站目前不支持修改昵称!"<<endl;
system("pause");
system("cls");
}
if(ch1==2)
{
cout<<"请输入 "<<vhname<<" 的新密码:";
cin>>newpass;
huser=newpass;
cout<<"修改成功!"<<endl;
system("pause");
system("cls");
}
if(ch1==3)
{
vhuser="管理团队";
cout<<"设置成功!"<<endl;
system("pause");
system("cls");
}
if(ch1==4)
{
vhuser="VIP用户";
cout<<"设置成功!"<<endl;
system("pause");
system("cls");
}
if(ch1==5)
{
vhuser="普通用户";
cout<<"设置成功!"<<endl;
system("pause");
system("cls");
}
if(ch1==6)
{
vhuser="禁止访问";
cout<<"设置成功!"<<endl;
system("pause");
system("cls");
}
if(ch==7)
{
return ;
}
}
void namewrite()
{
system("cls");
cout<<"抱歉,因为用户名混乱,本站不支持任何用户名修改!"<<endl;
system("pause");
system("cls");
}
void passwrite()
{
int vnewpass;
int hpass2;
string vhname2;
system("cls");
cout<<"为了保证账户安全,您需要重新进行用户名、密码的验证"<<endl;
cout<<"请输入您的账号:";
cin>>vhname2;
cout<<"请输入您的密码:";
cin>>hpass2;
if(huser != hpass2)
{
cout<<"账户或密码错误!"<<endl;
system("pause");
system("cls");
return ;
}
cout<<"输入正确!请输入您的新密码:";
cin>>vnewpass;
huser=vnewpass;
cout<<"修改成功!"<<endl;
system("pause");
system("cls");
yesno='n';
return ;
}
void work1()
{
int ch=0;
if(yesno='y')
{
if(huser != pass )
{
cout<<"账号或密码错误!"<<endl;
system("pause");
system("cls");
yesno ='n';
return ;
}
if(vhuser == "管理团队")
{
yesno='y';
ch=0;
cout<<"欢迎您回到首页,尊敬的用户 "<<vname<<",您的用户组为 "<<vhuser<<endl;
Sleep(1000);
system("cls");
cout<<"------欢迎来到商家助理 V3.0------"<<endl;
cout<<"请选择您需要使用的功能:"<<endl;
cout<<"1.计算功能 2.添加商品 3.商品查价"<<endl;
cout<<"4.删除商品 5.智能账本 6.意见反馈"<<endl;
cout<<"7.添加账户 8.删除账户 9.管理账户"<<endl;
cout<<"10.修改昵称 11.修改密码 12.退出账户"<<endl;
cout<<"13.升级日志 14.关闭程序 15.关闭电脑" <<endl;
cout<<"请输入您的选择:";
cin>>ch;
if(ch==1) clac();
if(ch==2) store();
if(ch==3) vfind();
if(ch==4) vdel();
if(ch==5) yuanwrite();
if(ch==6) word();
if(ch==7) newuser();
if(ch==8) vdeluser();
if(ch==9) aduser();
if(ch==10) namewrite();
if(ch==11) passwrite();
if(ch==13) vsay();
if(ch==14) close();
if(ch==15) systemclose();
if(ch==12)//12放在最后才能退出账户
{
yesno='n';
system("cls");
return ;
}
}
if(vhuser == "VIP用户")
{
yesno='y';
ch=0;
cout<<"欢迎您回到首页,尊敬的用户 "<<vname<<",您的用户组为 "<<vhuser<<endl;
Sleep(1000);
system("cls");
cout<<"------欢迎来到商家助理 V3.0------"<<endl;
cout<<"请选择您需要使用的功能:"<<endl;
cout<<"1.计算功能 2.添加商品 3.商品查价"<<endl;
cout<<"4.删除商品 5.智能账本 6.意见反馈"<<endl;
cout<<"7.修改昵称 8.修改密码 9.退出账户"<<endl;
cout<<"10.升级日志" <<endl;
cout<<"请输入您的选择:";
cin>>ch;
if(ch==1) clac();
if(ch==2) store();
if(ch==3) vfind();
if(ch==4) vdel();
if(ch==5) yuanwrite();
if(ch==6) word();
if(ch==7) namewrite();
if(ch==8) passwrite();
if(ch==10) vsay();
if(ch==9)//9放在最后才能退出账户
{
yesno='n';
system("cls");
return ;
}
}
if(vhuser == "普通用户")
{
yesno='y';
ch=0;
cout<<"欢迎您回到首页,尊敬的用户 "<<vname<<",您的用户组为 "<<vhuser<<endl;
Sleep(1000);
system("cls");
cout<<"------欢迎来到商家助理 V3.0------"<<endl;
cout<<"请选择您需要使用的功能:"<<endl;
cout<<"1.计算功能 2.添加商品 3.商品查价"<<endl;
cout<<"4.智能账本 5.修改昵称 6.修改密码"<<endl;
cout<<"7.退出账户 8.升级日志" <<endl;
cout<<"请输入您的选择:";
cin>>ch;
if(ch==1) clac();
if(ch==2) store();
if(ch==3) vfind();
if(ch==4) yuanwrite();
if(ch==5) namewrite();
if(ch==6) passwrite();
if(ch==8) vsay();
if(ch==7)//9放在最后才能退出账户
{
yesno='n';
system("cls");
return ;
}
}
if(vhuser == "禁止访问")
{
ch=0;
cout<<"欢迎您回来,尊敬的用户 "<<vname<<",您的用户组为 "<<vhuser<<endl;
Sleep(1000);
system("cls");
cout<<"------欢迎来到商家助理 V3.0------"<<endl;
cout<<"提醒:您的账户已被封禁"<<endl;
cout<<"1.退出账户"<<endl;
cin>>ch;
if(ch==1)
{
cout<<"1秒后即将退出账户,感谢您的使用"<<endl;
Sleep(1000);
system("cls");
yesno='n';
return ;
}
}
}
}
int main()
{
huser ["Admin"]=123456;
vhuser ["Admin"]="管理团队";
start();
vspeak();
hello();
while(true)
{
work1();
}
}
就是只在work1函数中的输入密码环节设置输入内容为“*”,后面输入完了就解除(不过不要那种按退格键或者回车键就自动加一个字符的那种)
抱歉,给大家添麻烦了 本帖最后由 tommyyu 于 2023-1-2 17:14 编辑
可以使用getch函数来实现,但是局限性可能比较大 应该可以实现吧{:10_277:} tommyyu 发表于 2023-1-2 17:06
可以使用getch函数来实现,但是局限性可能比较大
具体? 个人认为可能是 cout, cin 的问题{:10_282:} 代码有点混乱,我整理整理{:10_282:} 不说 work1 输入密码的问题,首先我感觉这个代码的逻辑特别奇怪,您可以顺着这个代码的逻辑模拟一遍,来排查一些问题吗?{:10_291:} yesno是干啥的? 本帖最后由 tommyyu 于 2023-1-2 17:32 编辑
#include<conio.h>
#include<string>
using namespace std;
int main()
{
string password;
char c;
while((c = getch())) {
if(c == '\r') break; //mac和windows是\r,linux是\n
if(!('a' <= c && c <= 'z') && \
!('A' <= c && c <= 'Z') && \
!('0' <= c && c <= '9') && \
c != '!' && c != '@' && c != '#' && c != '$' && c != '%' && c != '^' && c != '&' && c != '*' && c != '(' \
&& c != ')' && c != '[' && c != ']' && c != '{' && c != '}' && c != '_' && c != '-' && c != '+' && c != '=' \
&& c != '|' && c != '\\'&& c != '`' && c != '~' && c != ';' && c != ':' && c != '\''&& c != '"' && c != ',' \
&& c != '.' && c != '<' && c != '>' && c != '?' && c != '/' && c != 8) continue;
else if(c == 8) {
if(password.length() != 0) {
printf("\b");
printf(" ");
printf("\b");
password.erase(password.length()-1, 1);
}
}
else {
password += c;
printf("*", c);
}
}
printf("\n%s", password.c_str());
return 0;
} 517行:
if(yesno='y')
一看即错
而且加上也不对,因为 yesno 一开始初始化为 'n' ,对吧,而且start,vspeak,hello不会影响 yesno, 所以 work1 什么都没有 work
tommyyu 发表于 2023-1-2 17:31
楼主的意思是改这个代码,在不破坏本意的情况也达到那种星号的效果
不过我觉得改代码本身的bug就得占8成的时间了{:10_266:} zhangjinxuan 发表于 2023-1-2 17:33
楼主的意思是改这个代码,在不破坏本意的情况也达到那种星号的效果
不过我觉得改代码本身的bug就得占8 ...
我都懒得看源码{:10_282:} tommyyu 发表于 2023-1-2 17:34
我都懒得看源码
不想改了,bug又多,格式又有点……{:10_266:}
【给楼主说的话】
我的意思是说建议加一些注释{:10_282:} tommyyu 发表于 2023-1-2 17:40
大概看了看程序,好像没有设计登录/注册这一部分
注册有,登陆似乎也有,但是好像没有在适当的位置进行调用,也就导致了程序连密码都没有输入就歇菜了 zhangjinxuan 发表于 2023-1-2 17:33
楼主的意思是改这个代码,在不破坏本意的情况也达到那种星号的效果
不过我觉得改代码本身的bug就得占8 ...
本身测试没有bug哦~ 本帖最后由 人造人 于 2023-1-2 17:50 编辑
我没有找到通用的方法
这个代码不知道windows能不能用
dev-cpp的话应该能用吧
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <stdbool.h>
void echo(bool enable) {
struct termios attr;
tcgetattr(STDOUT_FILENO, &attr);
attr.c_lflag &= ~(ICANON | ECHO);
if(enable) attr.c_lflag |= ICANON | ECHO;
tcsetattr(STDOUT_FILENO, TCSANOW, &attr);
}
void get_passwd(char buff[], size_t size, bool display_star) {
if(size == 0) return;
echo(false);
for(size_t i = 0; i < size - 1; ++i) {
int ch = getchar();
if(ch == '\n' || ch == EOF) break;
*buff++ = ch;
if(display_star) putchar('*');
}
*buff = '\0';
putchar('\n');
echo(true);
}
int main(void) {
char buff;
printf("请输入密码:");
get_passwd(buff, 1024, true);
puts(buff);
printf("请输入名字:");
scanf("%s", buff);
puts(buff);
return 0;
}
zhangjinxuan 发表于 2023-1-2 17:42
注册有,登陆似乎也有,但是好像没有在适当的位置进行调用,也就导致了程序连密码都没有输入就歇菜了
我是真没找到登陆在哪{:10_282:} 那我还是忙我的帖子吧{:10_257:} tommyyu 发表于 2023-1-2 17:51
我是真没找到登陆在哪
好像是没有,我们好像都没有理解楼主的意思{:10_306:}
页:
[1]