鱼C论坛

 找回密码
 立即注册
查看: 3444|回复: 7

[已解决]c语言问题,如何使登陆密码变成星号

[复制链接]
发表于 2019-3-11 14:41:00 | 显示全部楼层 |阅读模式
5鱼币
  1. #include <stdio.h>
  2. #include <stdlib.h>//其中包含system函数
  3. #include <conio.h>//定义了通过控制台进行 数据输入 和数据输出的函数,如getch函数。
  4. #include <string.h>//定义字符数组
  5. #include <math.h>

  6. #define LEN2 sizeof(struct land)//有关登录系统的结构体

  7. struct land//登录信息
  8. {
  9.         int zhanghao;
  10.         char password[20];
  11.         struct land*next;
  12. };


  13. int tjzs();//统计library文本个数函数
  14. void xg(int,char[] );
  15. void mainmenu();//显示主菜单
  16. void lmenu();//显示登录菜单
  17. void main1();// 主菜单功能
  18. void land();//登录功能系统
  19. int xinjian(int,char[] );//创建账号密码
  20. void xgmm();//修改密码
  21. void lmain();//登录界面函数

  22. int tjzs3()//统计账号密码文本个数
  23. {
  24. FILE *fp;
  25. int zhao=0,n;
  26. char mm[20]={'\0'};
  27. fp=fopen("land.txt","r");//打开文件
  28. for (n=0;!feof(fp);n++)//逐个读文件
  29. fscanf(fp,"%d %s",&zhao,mm);
  30. n--;
  31. fclose(fp);//关闭文件
  32. return (n);//返回个数
  33. }

  34. void main1()
  35. {

  36.         char choose;

  37.         scanf(" %c",&choose);
  38.         switch(choose)//功能函数
  39.   {
  40.           case'1':

  41.             break;
  42.           case'2':

  43.                   break;
  44.           case'3':
  45.                   system("cls");
  46.     getch();
  47.           exit(0);
  48.           system ("cls");
  49.         break;
  50.   }
  51. }

  52. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`

  53. void lmenu()//显示登录菜单
  54. {

  55. printf("\n\n\t    欢迎使用会员登录系统\n\n");
  56. printf("**********************************************");
  57. printf("\n\n\t\t1.登录系统\n\n");
  58. printf("\n\n\t\t2.创建账号\n\n");
  59. printf("\n\n\t\t3.修改密码\n\n");
  60. printf("\n\n\t\t4.退出系统\n\n");
  61. printf("\n\n\t    请按键选择,回车确定\n");
  62. printf("**********************************************");
  63. return ;
  64. }


  65. void lmain()//登录功能函数
  66. {
  67.         void land();
  68.         void xinjian();
  69.         char choose;
  70.         lmenu();
  71.         scanf(" %c",&choose);
  72.         switch(choose)//功能函数
  73.   {
  74.           case'1':
  75.             land();
  76.             break;
  77.           case'2':
  78.                   xinjian();
  79.                   break;
  80.                   case'3':
  81.                   xgmm();
  82.                   break;
  83.           case'4':
  84.                   system("cls");
  85.     getch();
  86.           exit(0);
  87.           system ("cls");
  88.         break;
  89.   }
  90. }



  91. void xinjian()//新建账户密码
  92. {
  93.         FILE *fp;
  94.         int zhanghao;
  95.         char password[20],password1[20];
  96.         char hit=0;
  97.         if ((fp=fopen("land.txt","r"))==NULL)//if语句:打开图书馆文件,不存在此文件则新建
  98.         {
  99.       fp=fopen("land.txt","w");
  100.       fclose(fp);
  101.     }
  102.     system("cls");
  103.         fp=fopen("land.txt","a");
  104.         for(;;)//输入两次密码确认,两次相同才能确认
  105.         {
  106.            printf("\n请按以下格式输入账户:\n学号 密码\n");
  107.            printf("请输入:");
  108.            scanf("%d %s",&zhanghao,password);
  109.        printf("再次输入密码:\n");
  110.            scanf("%s",password1);
  111.            if(strcmp(password,password1)==0)
  112.            {
  113.                fprintf(fp,"%d %s\n",zhanghao,password);
  114.                    break;
  115.        }
  116.        else
  117.            {
  118.                printf("两次输入密码不一致,继续创建按回车,退出按ESC");
  119.                hit=getch();
  120.                    if(hit=27)
  121.                    system("cls");
  122.                    lmain();
  123.                          }
  124.    }
  125.    fclose(fp);
  126.    printf("创建成功,按任意键返回");
  127.    getch();
  128.    system("cls");
  129.    lmain();
  130. }



  131. int match(int m,char a[20])//匹配数据库中的账号密码
  132. {
  133.         FILE*fp;
  134.         int n=0,i=0;
  135.         int zhanghao;
  136.         char password[20];

  137.         if ((fp=fopen("land.txt","r"))==NULL)//不存在读者文件
  138.           {
  139.          system ("cls");
  140.                  printf("\n 还未存在用户!请新建账户");
  141.                  getch();
  142.                  system("cls");
  143.                 lmain();

  144.       }


  145.         for(;!feof(fp);)
  146.       {
  147.         fscanf(fp,"%d%s",&zhanghao,password);
  148.         if(m==zhanghao)
  149.         {
  150.                 if(strcmp(a,password)==0)
  151.                         return 1;
  152.                         else
  153.                         {
  154.                         return -1;
  155.                    }
  156.             }
  157.           }
  158.           return 0;
  159. }

  160. void land()//输入账户密码的登录函数
  161. {
  162.         int zhanghao;
  163.         char password[20];
  164.         int i=2,j,k,n;
  165.         char hit=0;
  166.         system("cls");
  167.         do
  168.         {
  169.            printf("\n请输入账号:\n");
  170.        scanf("%d",&zhanghao);
  171.        printf("确认输入请安回车,重新输入请按ECS");
  172.        hit=getch();//暂停程序当i接收后继续下一条指令
  173.        for (;hit!=13&&hit!=27;)//保证只能是CR和ESC才能退出循环,输入其他字符无用,暂停程序,按'CR'继续。
  174.        {
  175.                 hit=getch();
  176.            }
  177.     }
  178.     while(hit==27);
  179.          printf("\n请输入密码:\n");
  180.          scanf("%s",password);
  181.      i=match(zhanghao,password);
  182.      if(i==1)
  183.          {
  184.        printf("登陆成功!按任意键继续");
  185.            getch();
  186.            main1();
  187.          }
  188.          else
  189.          {
  190.                  if(i==-1)
  191.                  {
  192.                  printf("密码错误!");
  193.                  getch();
  194.          land();
  195.                  }
  196.                  if(i==0)
  197.                  printf("不存在此用户");
  198.                  getch();
  199.                  system("cls");
  200.                  lmain();
  201.          }
  202. }

  203. void xg(int z,char m[20])//修改函数
  204. {
  205.         FILE *fp;
  206.         int zhanghao1,n,j,k;
  207.         char mima1[20];
  208.         struct land *head,*p,*p1,*p2;

  209.          fp=fopen("land.txt","r");
  210.            j =tjzs3();

  211.            for (k=0;k<=j;k++)
  212.        {
  213.                fscanf(fp,"%d %s",&zhanghao1,mima1);
  214.            if (z!=zhanghao1)//比较名字,将不同名字的信息复制到链表
  215.           {
  216.                     n++;//相同返回值为0不执行if语句继续循环,不同则执行直到将所有不同的书名建立成链表
  217.                     if (n==1)//建立链表
  218.                 {
  219.                           p1=p2=(struct land*)malloc(LEN2);
  220.                   head=p1;
  221.                                 }
  222.                 else
  223.                             {
  224.                               p2->next=p1;
  225.                                   p2=p1;
  226.                   p1=(struct land*)malloc(LEN2);//新建链表
  227.                 }
  228.                                  p1->zhanghao=zhanghao1;
  229.                 strcpy(p1->password,mima1);//复制账号密码
  230.           }
  231.        }
  232.         if (n==0)
  233.                          {
  234.                          head=NULL;
  235.                          }
  236.                          else//建立链表的最后剩余一个储存空间,所以封底
  237.                          {
  238.                          p2->next=p1;
  239.                          p1->next=NULL;
  240.                          fclose(fp);
  241.                          }
  242.                           fp=fopen("land.txt","w");//清空文件,只写打开,然后关闭
  243.               fclose(fp);
  244.               fp=fopen("land.txt","a");//追加文件
  245.               p=head;
  246.             for (;p!=NULL;)//把链表内容覆盖到文件
  247.                            {
  248.                                        fprintf(fp,"%d %s%\n",p->zhanghao,p->password);
  249.                                       p=p->next;
  250.                 }
  251.                 fprintf(fp,"%d %s\n",z,m);
  252.             fclose(fp);
  253.              system ("cls");

  254. }



  255. void xgmm()//修改密码
  256. {

  257.            FILE *fp;
  258.        int zh=0,k=0,many=0,m=0,n=0;
  259.        int chazhao,hit;
  260.        char mima[20]={'\0'},password1[20]={'\0'};
  261.        char  mm[20]={'\0'};
  262.        char i;

  263.        if ((fp=fopen("land.txt","r"))==NULL)//打开文件
  264.        {
  265.                system ("cls");
  266.            printf("\n记录文件不存在!按任意键返回");
  267.                      getch();
  268.                      system("cls");
  269.                    lmain();
  270.        }
  271.            system("cls");
  272.        printf("请输入你的帐号和旧密码:\n");
  273.        scanf("%d %s",&chazhao,mima);
  274.            m =tjzs3();
  275.            for (n=0;n<=m;n++)
  276.            {
  277.             fscanf(fp,"%d %s",&zh,mm);
  278.         if(zh==chazhao)
  279.         {
  280.                 if(!strcmp(mm,mima))
  281.                 {
  282.                         printf("请输入新的密码");
  283.                         scanf("%s",mima);
  284.                            printf("再次输入密码:\n");
  285.                     scanf("%s",password1);
  286.                      if(strcmp(mima,password1)==0)
  287.                                     {
  288.                              xg(chazhao,mima);
  289.                             getch();
  290.                                     lmain();
  291.                         system("cls");
  292.                                 }
  293.                                  else
  294.                                      {
  295.                                             printf("两次输入密码不一致,按任意键退出");
  296.                                          hit=getch();
  297.                                              system("cls");
  298.                                       lmain();

  299.                                      }
  300.                         }
  301.                         else
  302.                         {
  303.                                 printf("旧密码错误,按任意键返回!");
  304.                                 getch();
  305.                                 system("cls");
  306.                                 lmain();

  307.                         }

  308.         }
  309.       }
  310.            printf("不存在此账号,按任意键返回");
  311.                 fclose(fp);//修改结束
  312.                 getch();
  313.                 system("cls");
  314.                 lmain();
  315. }

  316. int main()
  317. {
  318.         system("color 1F");
  319.         lmain();
  320.         return 0;
  321. }
复制代码


大神求指教!如何使使密码输入时可以变成*号
最佳答案
2019-3-11 14:41:01
你提两遍问题,我就答两遍得了
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <conio.h>

  4. #ifdef CPP
  5. #define getch _getch
  6. #endif

  7. const char CHAR_BACKSPACE = 8;
  8. const char CHAR_ENTER = 13;

  9. COORD getxy() {
  10.         CONSOLE_SCREEN_BUFFER_INFO info;
  11.         HANDLE hscr = GetStdHandle(STD_OUTPUT_HANDLE);
  12.         GetConsoleScreenBufferInfo(hscr, &info);
  13.         return info.dwCursorPosition;
  14. }
  15. void gotoxy(int x, int y) {
  16.         COORD coord = { x,y };
  17.         HANDLE hscr = GetStdHandle(STD_OUTPUT_HANDLE);
  18.         SetConsoleCursorPosition(hscr, coord);
  19. }


  20. char* InputPassword(char* password) {
  21.         COORD startpos = getxy();
  22.         int i = 0;
  23.         while ((password[i] = getch()) != CHAR_ENTER) {
  24.                 if (password[i] == CHAR_BACKSPACE) {
  25.                         if (i > 0) {
  26.                                 gotoxy(startpos.X + (--i), startpos.Y);
  27.                                 printf(" ");
  28.                                 gotoxy(startpos.X + i, startpos.Y);
  29.                         }
  30.                         continue;
  31.                 }
  32.                 printf("*");
  33.                 ++i;
  34.         }
  35.         password[i] = '\0';
  36.         return password;
  37. }

  38. int main() {
  39.         printf("请输入密码:\n");
  40.         char password[128];
  41.         InputPassword(password);
  42.         printf("\n您输入的密码为:%s", password);
  43.         system("pause");
  44. }
复制代码

最佳答案

查看完整内容

你提两遍问题,我就答两遍得了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-3-11 14:41:01 | 显示全部楼层    本楼为最佳答案   
你提两遍问题,我就答两遍得了
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <conio.h>

  4. #ifdef CPP
  5. #define getch _getch
  6. #endif

  7. const char CHAR_BACKSPACE = 8;
  8. const char CHAR_ENTER = 13;

  9. COORD getxy() {
  10.         CONSOLE_SCREEN_BUFFER_INFO info;
  11.         HANDLE hscr = GetStdHandle(STD_OUTPUT_HANDLE);
  12.         GetConsoleScreenBufferInfo(hscr, &info);
  13.         return info.dwCursorPosition;
  14. }
  15. void gotoxy(int x, int y) {
  16.         COORD coord = { x,y };
  17.         HANDLE hscr = GetStdHandle(STD_OUTPUT_HANDLE);
  18.         SetConsoleCursorPosition(hscr, coord);
  19. }


  20. char* InputPassword(char* password) {
  21.         COORD startpos = getxy();
  22.         int i = 0;
  23.         while ((password[i] = getch()) != CHAR_ENTER) {
  24.                 if (password[i] == CHAR_BACKSPACE) {
  25.                         if (i > 0) {
  26.                                 gotoxy(startpos.X + (--i), startpos.Y);
  27.                                 printf(" ");
  28.                                 gotoxy(startpos.X + i, startpos.Y);
  29.                         }
  30.                         continue;
  31.                 }
  32.                 printf("*");
  33.                 ++i;
  34.         }
  35.         password[i] = '\0';
  36.         return password;
  37. }

  38. int main() {
  39.         printf("请输入密码:\n");
  40.         char password[128];
  41.         InputPassword(password);
  42.         printf("\n您输入的密码为:%s", password);
  43.         system("pause");
  44. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-3-11 14:42:10 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-3-11 14:53:17 | 显示全部楼层
一般都是设计UI的时候可以实现这样的功能,用c在doc界面上修改不知道怎么弄
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-3-11 19:16:31 | 显示全部楼层
本帖最后由 jackz007 于 2019-3-11 20:30 编辑

    你的代码太长,就不看了,在这里解决一下键盘输入在屏幕上显示成 '*' 的问题,请参考下面的实验代码:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <conio.h>

  5. main(void)
  6. {
  7.        char c , pass[80]                          ;
  8.        int n                                      ;
  9.        printf("Enter Your Password : ")           ;
  10.        n = 0                                      ;
  11.        for(;;) {
  12.                c = getch()                        ;
  13.                if(c == 0x03 || c == 0x0d) {         // 如果按下了 Ctrl- C 或 < Return > 键
  14.                        if(c == 0x03) n = 0        ; // 如果按下了 Ctrl- C 键
  15.                        pass[n] = '\0'             ;
  16.                        printf("\n")               ;
  17.                        break                      ;
  18.                } else if (c == 0x08) {              // 如果按下了 < Backspace > 键
  19.                        if(n > 0) {                  // 只有 pass[] 里面有字符时才执行删除
  20.                                printf("\b \b")    ; // 擦除一个字符
  21.                                pass[-- n] = '\0'  ;
  22.                        }
  23.                } else {                             // 如果是正常字符输入
  24.                        printf("*"    )            ;
  25.                        pass[n ++] = c             ;
  26.                }
  27.        }
  28.        printf("Your Password is : [%s]\n" , pass) ;
  29. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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[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;
}

请问可以解释一下这个部分吗 没大看懂 如果有注释就好啦(^U^)ノ~YO
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-3-12 22:34:30 | 显示全部楼层
参考jackz007的吧,我搞麻烦了,忘了可以直接printf退格键,
gotoxy()和getxy()是移动和获取当前光标位置,我搞了这两个来模拟退格键。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-3-13 17:59:08 | 显示全部楼层
本帖最后由 jackz007 于 2019-3-13 18:03 编辑
Croper 发表于 2019-3-12 22:34
参考jackz007的吧,我搞麻烦了,忘了可以直接printf退格键,
gotoxy()和getxy()是移动和获取当前光标位置 ...


      老兄是个真正的君子,必须赞一个!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 07:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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