hjwwwwww 发表于 2019-3-11 14:41:00

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;
}


大神求指教!如何使使密码输入时可以变成*号

Croper 发表于 2019-3-11 14:41:01

你提两遍问题,我就答两遍得了
#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");
}

hjwwwwww 发表于 2019-3-11 14:42:10

@BngThea

BngThea 发表于 2019-3-11 14:53:17

一般都是设计UI的时候可以实现这样的功能,用c在doc界面上修改不知道怎么弄

jackz007 发表于 2019-3-11 19:16:31

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

hjwwwwww 发表于 2019-3-12 12:03:51

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:}

Croper 发表于 2019-3-12 22:34:30

参考jackz007的吧,我搞麻烦了,忘了可以直接printf退格键,
gotoxy()和getxy()是移动和获取当前光标位置,我搞了这两个来模拟退格键。。

jackz007 发表于 2019-3-13 17:59:08

本帖最后由 jackz007 于 2019-3-13 18:03 编辑

Croper 发表于 2019-3-12 22:34
参考jackz007的吧,我搞麻烦了,忘了可以直接printf退格键,
gotoxy()和getxy()是移动和获取当前光标位置 ...

      老兄是个真正的君子,必须赞一个!
页: [1]
查看完整版本: c语言问题,如何使登陆密码变成星号