c语言问题,如何使登陆密码变成星号
#include <stdio.h>#include <stdlib.h>//其中包含system函数
#include <conio.h>//定义了通过控制台进行 数据输入 和数据输出的函数,如getch函数。
#include <string.h>//定义字符数组
#include <math.h>
#define LEN2 sizeof(struct land)//有关登录系统的结构体
struct land//登录信息
{
int zhanghao;
char password;
struct land*next;
};
int tjzs();//统计library文本个数函数
void xg(int,char[] );
void mainmenu();//显示主菜单
void lmenu();//显示登录菜单
void main1();// 主菜单功能
void land();//登录功能系统
int xinjian(int,char[] );//创建账号密码
void xgmm();//修改密码
void lmain();//登录界面函数
int tjzs3()//统计账号密码文本个数
{
FILE *fp;
int zhao=0,n;
char mm={'\0'};
fp=fopen("land.txt","r");//打开文件
for (n=0;!feof(fp);n++)//逐个读文件
fscanf(fp,"%d %s",&zhao,mm);
n--;
fclose(fp);//关闭文件
return (n);//返回个数
}
void main1()
{
char choose;
scanf(" %c",&choose);
switch(choose)//功能函数
{
case'1':
break;
case'2':
break;
case'3':
system("cls");
getch();
exit(0);
system ("cls");
break;
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`
void lmenu()//显示登录菜单
{
printf("\n\n\t 欢迎使用会员登录系统\n\n");
printf("**********************************************");
printf("\n\n\t\t1.登录系统\n\n");
printf("\n\n\t\t2.创建账号\n\n");
printf("\n\n\t\t3.修改密码\n\n");
printf("\n\n\t\t4.退出系统\n\n");
printf("\n\n\t 请按键选择,回车确定\n");
printf("**********************************************");
return ;
}
void lmain()//登录功能函数
{
void land();
void xinjian();
char choose;
lmenu();
scanf(" %c",&choose);
switch(choose)//功能函数
{
case'1':
land();
break;
case'2':
xinjian();
break;
case'3':
xgmm();
break;
case'4':
system("cls");
getch();
exit(0);
system ("cls");
break;
}
}
void xinjian()//新建账户密码
{
FILE *fp;
int zhanghao;
char password,password1;
char hit=0;
if ((fp=fopen("land.txt","r"))==NULL)//if语句:打开图书馆文件,不存在此文件则新建
{
fp=fopen("land.txt","w");
fclose(fp);
}
system("cls");
fp=fopen("land.txt","a");
for(;;)//输入两次密码确认,两次相同才能确认
{
printf("\n请按以下格式输入账户:\n学号 密码\n");
printf("请输入:");
scanf("%d %s",&zhanghao,password);
printf("再次输入密码:\n");
scanf("%s",password1);
if(strcmp(password,password1)==0)
{
fprintf(fp,"%d %s\n",zhanghao,password);
break;
}
else
{
printf("两次输入密码不一致,继续创建按回车,退出按ESC");
hit=getch();
if(hit=27)
system("cls");
lmain();
}
}
fclose(fp);
printf("创建成功,按任意键返回");
getch();
system("cls");
lmain();
}
int match(int m,char a)//匹配数据库中的账号密码
{
FILE*fp;
int n=0,i=0;
int zhanghao;
char password;
if ((fp=fopen("land.txt","r"))==NULL)//不存在读者文件
{
system ("cls");
printf("\n 还未存在用户!请新建账户");
getch();
system("cls");
lmain();
}
for(;!feof(fp);)
{
fscanf(fp,"%d%s",&zhanghao,password);
if(m==zhanghao)
{
if(strcmp(a,password)==0)
return 1;
else
{
return -1;
}
}
}
return 0;
}
void land()//输入账户密码的登录函数
{
int zhanghao;
char password;
int i=2,j,k,n;
char hit=0;
system("cls");
do
{
printf("\n请输入账号:\n");
scanf("%d",&zhanghao);
printf("确认输入请安回车,重新输入请按ECS");
hit=getch();//暂停程序当i接收后继续下一条指令
for (;hit!=13&&hit!=27;)//保证只能是CR和ESC才能退出循环,输入其他字符无用,暂停程序,按'CR'继续。
{
hit=getch();
}
}
while(hit==27);
printf("\n请输入密码:\n");
scanf("%s",password);
i=match(zhanghao,password);
if(i==1)
{
printf("登陆成功!按任意键继续");
getch();
main1();
}
else
{
if(i==-1)
{
printf("密码错误!");
getch();
land();
}
if(i==0)
printf("不存在此用户");
getch();
system("cls");
lmain();
}
}
void xg(int z,char m)//修改函数
{
FILE *fp;
int zhanghao1,n,j,k;
char mima1;
struct land *head,*p,*p1,*p2;
fp=fopen("land.txt","r");
j =tjzs3();
for (k=0;k<=j;k++)
{
fscanf(fp,"%d %s",&zhanghao1,mima1);
if (z!=zhanghao1)//比较名字,将不同名字的信息复制到链表
{
n++;//相同返回值为0不执行if语句继续循环,不同则执行直到将所有不同的书名建立成链表
if (n==1)//建立链表
{
p1=p2=(struct land*)malloc(LEN2);
head=p1;
}
else
{
p2->next=p1;
p2=p1;
p1=(struct land*)malloc(LEN2);//新建链表
}
p1->zhanghao=zhanghao1;
strcpy(p1->password,mima1);//复制账号密码
}
}
if (n==0)
{
head=NULL;
}
else//建立链表的最后剩余一个储存空间,所以封底
{
p2->next=p1;
p1->next=NULL;
fclose(fp);
}
fp=fopen("land.txt","w");//清空文件,只写打开,然后关闭
fclose(fp);
fp=fopen("land.txt","a");//追加文件
p=head;
for (;p!=NULL;)//把链表内容覆盖到文件
{
fprintf(fp,"%d %s%\n",p->zhanghao,p->password);
p=p->next;
}
fprintf(fp,"%d %s\n",z,m);
fclose(fp);
system ("cls");
}
void xgmm()//修改密码
{
FILE *fp;
int zh=0,k=0,many=0,m=0,n=0;
int chazhao,hit;
char mima={'\0'},password1={'\0'};
charmm={'\0'};
char i;
if ((fp=fopen("land.txt","r"))==NULL)//打开文件
{
system ("cls");
printf("\n记录文件不存在!按任意键返回");
getch();
system("cls");
lmain();
}
system("cls");
printf("请输入你的帐号和旧密码:\n");
scanf("%d %s",&chazhao,mima);
m =tjzs3();
for (n=0;n<=m;n++)
{
fscanf(fp,"%d %s",&zh,mm);
if(zh==chazhao)
{
if(!strcmp(mm,mima))
{
printf("请输入新的密码");
scanf("%s",mima);
printf("再次输入密码:\n");
scanf("%s",password1);
if(strcmp(mima,password1)==0)
{
xg(chazhao,mima);
getch();
lmain();
system("cls");
}
else
{
printf("两次输入密码不一致,按任意键退出");
hit=getch();
system("cls");
lmain();
}
}
else
{
printf("旧密码错误,按任意键返回!");
getch();
system("cls");
lmain();
}
}
}
printf("不存在此账号,按任意键返回");
fclose(fp);//修改结束
getch();
system("cls");
lmain();
}
int main()
{
system("color 1F");
lmain();
return 0;
}
大神求指教!如何使使密码输入时可以变成*号 你提两遍问题,我就答两遍得了
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#ifdef CPP
#define getch _getch
#endif
const char CHAR_BACKSPACE = 8;
const char CHAR_ENTER = 13;
COORD getxy() {
CONSOLE_SCREEN_BUFFER_INFO info;
HANDLE hscr = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hscr, &info);
return info.dwCursorPosition;
}
void gotoxy(int x, int y) {
COORD coord = { x,y };
HANDLE hscr = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hscr, coord);
}
char* InputPassword(char* password) {
COORD startpos = getxy();
int i = 0;
while ((password = getch()) != CHAR_ENTER) {
if (password == CHAR_BACKSPACE) {
if (i > 0) {
gotoxy(startpos.X + (--i), startpos.Y);
printf(" ");
gotoxy(startpos.X + i, startpos.Y);
}
continue;
}
printf("*");
++i;
}
password = '\0';
return password;
}
int main() {
printf("请输入密码:\n");
char password;
InputPassword(password);
printf("\n您输入的密码为:%s", password);
system("pause");
} @BngThea 一般都是设计UI的时候可以实现这样的功能,用c在doc界面上修改不知道怎么弄 本帖最后由 jackz007 于 2019-3-11 20:30 编辑
你的代码太长,就不看了,在这里解决一下键盘输入在屏幕上显示成 '*' 的问题,请参考下面的实验代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
main(void)
{
char c , pass ;
int n ;
printf("Enter Your Password : ") ;
n = 0 ;
for(;;) {
c = getch() ;
if(c == 0x03 || c == 0x0d) { // 如果按下了 Ctrl- C 或 < Return > 键
if(c == 0x03) n = 0 ; // 如果按下了 Ctrl- C 键
pass = '\0' ;
printf("\n") ;
break ;
} else if (c == 0x08) { // 如果按下了 < Backspace > 键
if(n > 0) { // 只有 pass[] 里面有字符时才执行删除
printf("\b \b") ; // 擦除一个字符
pass[-- n] = '\0';
}
} else { // 如果是正常字符输入
printf("*" ) ;
pass = c ;
}
}
printf("Your Password is : [%s]\n" , pass) ;
}
Croper 发表于 2019-3-11 14:41
你提两遍问题,我就答两遍得了
COORD getxy() {
CONSOLE_SCREEN_BUFFER_INFO info;
HANDLE hscr = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hscr, &info);
return info.dwCursorPosition;
}
void gotoxy(int x, int y) {
COORD coord = { x,y };
HANDLE hscr = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hscr, coord);
}
char* InputPassword(char* password) {
COORD startpos = getxy();
int i = 0;
while ((password = getch()) != CHAR_ENTER) {
if (password == CHAR_BACKSPACE) {
if (i > 0) {
gotoxy(startpos.X + (--i), startpos.Y);
printf(" ");
gotoxy(startpos.X + i, startpos.Y);
}
continue;
}
printf("*");
++i;
}
password = '\0';
return password;
}
请问可以解释一下这个部分吗 没大看懂 如果有注释就好啦(^U^)ノ~YO{:10_278:} 参考jackz007的吧,我搞麻烦了,忘了可以直接printf退格键,
gotoxy()和getxy()是移动和获取当前光标位置,我搞了这两个来模拟退格键。。 本帖最后由 jackz007 于 2019-3-13 18:03 编辑
Croper 发表于 2019-3-12 22:34
参考jackz007的吧,我搞麻烦了,忘了可以直接printf退格键,
gotoxy()和getxy()是移动和获取当前光标位置 ...
老兄是个真正的君子,必须赞一个!
页:
[1]