hjwwwwww 发表于 2019-3-11 13:16:09

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

本帖最后由 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;
        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;
}

问题:
1.请帮我修改下代码 使密码输入时可以变成*号{:10_319:}

°希作先生丶 发表于 2019-3-11 14:42:40

while(ch != '\n')
{
   ch=getch();
printf("*");
   pwd = getch;
   i++;
}
pwd = '\0';
大概就是这样吧,getch()是一个不回显的函数,ch是接受字符的临时变量,pwd是存储密码的数组

°希作先生丶 发表于 2019-3-11 14:43:27

°希作先生丶 发表于 2019-3-11 14:42
while(ch != '\n')
{
   ch=getch();


不过这个不太完整,应该还加上一个对退格键的判断相应消除*

Croper 发表于 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 = 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");
}

jackz007 发表于 2019-3-13 17:55:34

请参考此贴 : https://fishc.com.cn/forum.php?mod=redirect&goto=findpost&ptid=132153&pid=3798789
页: [1]
查看完整版本: C语言问题,写登陆系统函数时如何使密码加密回显星号