鱼C论坛

 找回密码
 立即注册
查看: 2514|回复: 4

C语言问题,写登陆系统函数时如何使密码加密回显星号

[复制链接]
发表于 2019-3-11 13:16:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 hjwwwwww 于 2019-3-11 13:17 编辑
#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[20];
        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[20]={'\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[20],password1[20];
        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[20])//匹配数据库中的账号密码
{
        FILE*fp;
        int n=0,i=0;
        int zhanghao;
        char password[20];

        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[20];
        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[20])//修改函数
{
        FILE *fp;
        int zhanghao1,n,j,k;
        char mima1[20];
        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[20]={'\0'},password1[20]={'\0'};
       char  mm[20]={'\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;
}
问题:
1.请帮我修改下代码 使密码输入时可以变成*号
12~5}QPFX~}%7UAZBC7`GUR.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-11 14:42:40 | 显示全部楼层
while(ch != '\n')
{
   ch=getch();
  printf("*");
   pwd[i] = getch;
   i++;
}
pwd[i] = '\0';
大概就是这样吧,getch()是一个不回显的函数,ch是接受字符的临时变量,pwd是存储密码的数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-11 14:43:27 | 显示全部楼层
°希作先生丶 发表于 2019-3-11 14:42
while(ch != '\n')
{
   ch=getch();

不过这个不太完整,应该还加上一个对退格键的判断相应消除*
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-11 14:46:52 | 显示全部楼层
要把密码显示成“*”肯定不能用默认的scanf啦,自己重新写一个吧
给个参考:
#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[i] = getch()) != CHAR_ENTER) {
                if (password[i] == CHAR_BACKSPACE) {
                        if (i > 0) {
                                gotoxy(startpos.X + (--i), startpos.Y);
                                printf(" ");
                                gotoxy(startpos.X + i, startpos.Y);
                        }
                        continue;
                }
                printf("*");
                ++i;
        }
        password[i] = '\0';
        return password;
}

int main() {
        printf("请输入密码:\n");
        char password[128];
        InputPassword(password);
        printf("\n您输入的密码为:%s", password);
        system("pause");
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-13 17:55:34 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 10:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表