ZimingOSU 2022-10-28 07:47 采纳率: 100%
浏览 17
已结题

使用C++制作一个密码生成器

问题里需要包含以下选项:
这是例子:
你想要字母(0-no, 1-yes)吗?1
你想要大写字母(0-no, 1-yes)吗?1
密码的多少个字符应该是大写的?2
您需要小写字母(0-no, 1-yes)吗?1
密码中有多少个字符是小写的?4
你想要数字(0-no, 1-yes)吗?1
密码中应该有多少个字符是数字?4
您的随机密码是:ACbzdf1254。
(或AtCde1z254,都是可接受的密码)
是否要创建另一个密码(0-no, 1-yes)?0

谢谢hxd们的帮助~

  • 写回答

1条回答 默认 最新

  • .LAL. C/C++领域新星创作者 2022-10-28 07:55
    关注
    
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<string>
    #include<cstdlib>
    #include<ctime>
    #include<conio.h>
    #include<windows.h>
    #define LL long long
    using namespace std;
    string s11;
    char sf[27]={' ','~','!','@','#','$','%','^','&','*','_','+','-','=','/','(',')','{','}',';',':','[',']','<','>',',','.'};
    void End(int tag){
        if(tag==1)
            printf("\n生成成功!已为您保存到当前文件夹中的 password.txt ,请及时下载,重新生成密码会替换原来的密码!\n");
        else
            printf("\n生成成功!已为您保存到当前文件夹中的 password.csv ,请及时下载,重新生成密码会替换原来的密码!\n");
    }
    int R(int x){
        return ((LL)rand()*(LL)rand())%(LL)x+1ll;
    }
    void sj(){
        printf("您选择的类型:纯随机强密码\n\n");
        printf("请输入密码位数:");
        int n;
        scanf("%d",&n);
        system("cls");
        char ch='.',s[5];
        string ri[5];
        for(int i=0;i<=4;i++)
            s[i]=' ',ri[i]="  ";
        int now=1,g=4;
        string ss[5];
        ss[1]="数字";
        ss[2]="大写字母";
        ss[3]="小写字母";
        ss[4]="特殊符号  ~ ! @ # $ % ^ & * _ + - = ? / ( ) { } ; : [ ] < > , .";
        int flag=1;
        while(ch!='k'){
            printf("您选择的类型:纯随机强密码\n");
            printf("您输入密码位数:%d\n\n",n);
            printf("\n\n请选择所包含的字符类型(可多选):\n w s :上下控制\n j :确定选择此项(再次输入j取消选择)\n k :完成选择\n n :");
            if(flag==0)
                printf("取消"); 
            printf("全选\n m :反选\n (请先将输入模式调整为英文)\n\n");
            s[now]='>';
            for(int i=1;i<=g;i++)
                printf("   %c %s  %s\n",s[i],ri[i].c_str(),ss[i].c_str());
            ch=getch();
            system("cls");
            switch(ch){
                case 'w':{
                    s[now]=' ';
                    now--;
                    if(now==0)
                        now=g;
                    break;
                }
                case 's':{
                    s[now]=' ';
                    now++;
                    if(now==g+1)
                        now=1;
                    break;
                }
                case 'j':{
                    if(ri[now]=="  ")
                        ri[now]="√";
                    else
                        ri[now]="  ";
                    flag=1;
                    break;
                }
                case 'k':break;
                case 'n':{
                    if(flag==1)
                        for(int i=1;i<=g;i++)
                            ri[i]="√",flag=0;
                    else
                        for(int i=1;i<=g;i++)
                            ri[i]="  ",flag=1;
                    break;
                }
                case 'm':{
                    int ggg=0;
                    for(int i=1;i<=g;i++)
                        if(ri[i]=="  ")
                            ri[i]="√",ggg++;
                        else
                            ri[i]="  ";
                    flag=1;
                    if(ggg==g)
                        flag=0;
                    break;
                }
                default:{
                    printf("请输入'w','s','j','k','n'or'm'  谢谢合作!");
                    Sleep(1000);
                    system("cls");
                    break;
                }
            }
        }
        system("cls");
        printf("您选择的类型:纯随机强密码\n");
        printf("您输入密码位数:%d\n",n);
        printf("您选择所包含的字符类型:\n");
        int u=0,ak[5]={0};
        for(int i=1;i<=4;i++)
            if(ri[i]!="  "){
                printf("  %s\n",ss[i].c_str());
                u++;
                ak[u]=i;
            }
        End(1);
        FILE* l=fopen("password.txt","w");
        for(int i=1;i<=n;i++){
            int t=R(u);
            char sd;
            switch(ak[t]){
                case 1:{
                    sd=R(10)-1+'0';
                    break;
                }
                case 2:{
                    sd=R(26)-1+'A';
                    break;
                }
                case 3:{
                    sd=R(26)-1+'a';
                    break;
                }
                case 4:{
                    sd=sf[R(26)];
                    break;
                }
            }
            printf("%c",sd);
            fprintf(l,"%c",sd);
        }
        return ;
    }
    void sr(){
        string date;
        while(1){
            printf("请输入您的生日(纯数字)(如19980111):");
            cin>>date;
            if(date.size()!=8){
                printf("输入格式不正确!");
                Sleep(1000);
                system("cls");
                continue;
            }
            int flag=0;
            for(int i=0;i<8;i++)
                if(!isdigit(date[i])){
                    printf("输入格式不正确!");
                    Sleep(1000);
                    system("cls");
                    flag=1;
                    break;
                }
            if(flag==1)
                continue;
            break;
        }
        End(1);
        int dk=8;
        for(int i=0;i<dk;i++){
            int kk=R(5);
            if(kk!=1){
                int dd=R(4);
                while(dd--){
                    int pp=R(4);
                    string sd="";
                    switch(pp){
                        case 1:{
                            sd+=char(sf[R(26)]);
                            break;
                        }
                        case 2:{
                            sd+=char(R(26)-1+'A');
                            break;
                        }
                        case 3:{
                            sd+=char(R(26)-1+'a');
                            break;
                        }
                        case 4:{
                            sd+=char(sf[R(26)]);
                            break;
                        }
                    }
                    date.insert(i,sd);
                    i++;
                    dk++;
                }
            }
        }
        FILE* l=fopen("password.txt","w");
        printf("%s",date.c_str());
        fprintf(l,"%s",date.c_str());
        return ;
    }
    void mz(int daa){
        string name;
        while(1){
            if(daa==3)
                printf("请输入您的姓名拼音全拼或首字母(纯小写字母)(如zhangsan(张三):");
            else
                printf("请输入这句话拼音全拼或首字母(纯小写字母)(如angszax(爱你孤身走暗巷)):");
            cin>>name;
            int flag=0;
            for(int i=0;i<name.size();i++)
                if(!islower(name[i])){
                    printf("输入格式不正确!");
                    Sleep(1000);
                    system("cls");
                    flag=1;
                    break;
                }
            if(flag==1)
                continue;
            break;
        }
        End(1);
        int dk=name.size();
        for(int i=0;i<dk;i++){
            int kk=R(5);
            if(kk!=1){
                int dd=R(4);
                while(dd--){
                    int pp=R(5);
                    string sd="";
                    switch(pp){
                        case 1:{
                            sd+=char(sf[R(26)]);
                            break;
                        }
                        case 2:{
                            sd+=char(R(26)-1+'A');
                            break;
                        }
                        case 3:{
                            sd+=char(R(10)-1+'0');
                            break;
                        }
                        case 4:{
                            sd+=char(sf[R(26)]);
                            break;
                        }
                        case 5:{
                            name[i]=name[i]-'a'+'A';
                            break;
                        }
                    }
                    name.insert(i,sd);
                    i++;
                    dk++;
                }
            }
        }
        FILE* l=fopen("password.txt","w");
        printf("%s",name.c_str());
        fprintf(l,"%s",name.c_str());
        return ;
    }
    void self(int aad){
        printf("请输入一个字符串:");
        cin>>s11;
        End(1);
        int dk=s11.size();
        for(int i=0;i<dk;i++){
            int kk=R(5);
            if(kk!=1){
                int dd=R(4);
                while(dd--){
                    int pp=R(5);
                    string sd="";
                    switch(pp){
                        case 1:{
                            sd+=char(sf[R(26)]);
                            break;
                        }
                        case 2:{
                            sd+=char(R(26)-1+'A');
                            break;
                        }
                        case 3:{
                            sd+=char(R(26)-1+'a');
                            break;
                        }
                        case 4:{
                            sd+=char(sf[R(26)]);
                            break;
                        }
                        case 5:{
                            sd+=char(R(10)-1+'0');
                            break;
                        }
                    }
                    s11.insert(i,sd);
                    i++;
                    dk++;
                }
            }
        }
        if(aad==5){
            FILE* l=fopen("password.txt","w");
            printf("%s",s11.c_str());
            fprintf(l,"%s",s11.c_str());
        }
        else{
            printf("初步加密密码:");
            printf("%s",s11.c_str());
            Sleep(1000);
        }
        return ;
    }
    void pl(){
        system("cls");
        char ch='.',s[15/*网站总个数+1*/];
        string ri[15/*网站总个数+1*/];
        for(int i=0;i<=14/*网站总个数*/;i++)
            s[i]=' ',ri[i]="  ";
        int now=1,g=14/*网站总个数*/;
        string ss[15/*网站总个数+1*/],sss[15/*网站总个数+1*/];
        ss[1]="微信";
        sss[1]="weixin";
        ss[2]="QQ";
        sss[2]="QQ";
        ss[3]="百度";
        sss[3]="baidu"; 
        ss[4]="哔哩哔哩";
        sss[4]="bilibili";
        ss[5]="抖音";
        sss[5]="douyin";
        ss[6]="快手";
        sss[6]="kuaishou";
        ss[7]="微博";
        sss[7]="weibo";
        ss[8]="Microsoft账户";
        sss[8]="Microsoftzhanghu";
        ss[9]="Apple ID";
        sss[9]="AppleID";
        ss[10]="Android账户";
        sss[10]="Android账户";
        ss[11]="小米账户";
        sss[11]="xiaomizhanghu";
        ss[12]="华为账户";
        sss[12]="huaweizhuanghu";
        ss[13]="Windows PIN";
        sss[13]="WindowsPIN";
        ss[14]="Linux账户";
        sss[14]="Linuxzhanghu";
        /*
        ss[15]="";//网站原名 
        sss[15]="";//网站拼音 
        */
        int flag=1;
        while(ch!='k'){
            printf("初步加密密码:");
            printf("%s",s11.c_str());
            printf("\n\n请选择网站(可多选):\n w s :上下控制\n j :确定选择此项\n k :完成选择\n n :");
            if(flag==0)
                printf("取消"); 
            printf("全选\n m :反选\n (请先将输入模式调整为英文)\n\n");
            s[now]='>';
            for(int i=1;i<=g;i++)
                printf("   %c %s  %s\n",s[i],ri[i].c_str(),ss[i].c_str());
            ch=getch();
            system("cls");
            switch(ch){
                case 'w':{
                    s[now]=' ';
                    now--;
                    if(now==0)
                        now=g;
                    break;
                }
                case 's':{
                    s[now]=' ';
                    now++;
                    if(now==g+1)
                        now=1;
                    break;
                }
                case 'j':{
                    if(ri[now]=="  ")
                        ri[now]="√";
                    else
                        ri[now]="  ";
                    flag=1;
                    break;
                }
                case 'k':break;
                case 'n':{
                    if(flag==1)
                        for(int i=1;i<=g;i++)
                            ri[i]="√",flag=0;
                    else
                        for(int i=1;i<=g;i++)
                            ri[i]="  ",flag=1;
                    break;
                }
                case 'm':{
                    int ggg=0;
                    for(int i=1;i<=g;i++)
                        if(ri[i]=="  ")
                            ri[i]="√",ggg++;
                        else
                            ri[i]="  ";
                    flag=1;
                    if(ggg==g)
                        flag=0;
                    break;
                }
                default:{
                    printf("请输入'w','s','j','k','n'or'm'  谢谢合作!");
                    Sleep(1000);
                    system("cls");
                    break;
                }
            }
        }
        int u=0,ak[15]={0};
        for(int i=1;i<=14;i++)
            if(ri[i]!="  ")
                ak[++u]=i;
        system("cls");
        char ch2='.',s2[4];
        string ri2[4];
        for(int i=0;i<=3;i++)
            s2[i]=' ',ri2[i]="  ";
        int now2=1,g2=3;
        string ss2[4];
        ss2[1]="网站名拼音+'/'+初步加密密码(如:weixin/ah3d%hc)";
        ss2[2]="网站名拼音首字母+初步加密密码+网站名拼音尾字母(如:wah3d%hcn)";
        ss2[3]="在初步密码第(网站名拼音长度)位前插入在 shift+(网站名拼音长度)得到的字符(如:ah3d%^hc)";
        while(ch2!='k'){
            printf("初步加密密码:");
            printf("%s",s11.c_str());
            printf("\n\n请选择批量加密方式(单选):\n w s :上下控制\n j :选择此项(再次输入j取消选择)\n k :完成选择\n\n");
            s2[now2]='>';
            for(int i=1;i<=g2;i++)
                printf("   %c %s  %s\n",s2[i],ri2[i].c_str(),ss2[i].c_str());
            ch2=getch();
            system("cls");
            switch(ch2){
                case 'w':{
                    s2[now2]=' ';
                    now2--;
                    if(now2==0)
                        now2=g2;
                    break;
                }
                case 's':{
                    s2[now2]=' ';
                    now2++;
                    if(now2==g2+1)
                        now2=1;
                    break;
                }
                case 'j':{
                    for(int i=1;i<=g2;i++)
                        ri2[i]="  ";
                    ri2[now2]="√";
                    break;
                }
                case 'k':break;
                default:{
                    printf("请输入'w','s','j'or'k'  谢谢合作!");
                    Sleep(1000);
                    system("cls");
                    break;
                }
            }
        }
        system("cls");
        End(2);
        FILE* l=fopen("password.csv","w");
        fprintf(l,"网站,密码\n");
        switch(now2){
            case 1:{
                for(int i=1;i<=u;i++){
                    string ans=sss[ak[i]];
                    ans+="/";
                    ans+=s11;
                    printf("%s:\n%s\n",ss[ak[i]].c_str(),ans.c_str());
                    fprintf(l,"%s,%s\n",ss[ak[i]].c_str(),ans.c_str());
                }
                break;
            }
            case 2:{
                for(int i=1;i<=u;i++){
                    string ans="";
                    ans+=sss[ak[i]][0];
                    ans+=s11;
                    ans+=sss[ak[i]][sss[ak[i]].size()-1];
                    printf("%s:\n%s\n",ss[ak[i]].c_str(),ans.c_str());
                    fprintf(l,"%s,%s\n",ss[ak[i]].c_str(),ans.c_str());
                }
                break;
            }
            case 3:{
                for(int i=1;i<=u;i++){
                    string ans=s11;
                    string hc;
                    switch(sss[ak[i]].size()){
                        case 1:{
                            hc="!";
                            break;
                        }
                        case 2:{
                            hc="@";
                            break;
                        }
                        case 3:{
                            hc="#";
                            break;
                        }
                        case 4:{
                            hc="$";
                            break;
                        }
                        case 5:{
                            hc="%";
                            break;
                        }
                        case 6:{
                            hc="^";
                            break;
                        }
                        case 7:{
                            hc="&";
                            break;
                        }
                        case 8:{
                            hc="*";
                            break;
                        }
                        case 9:{
                            hc="(";
                            break;
                        }
                        case 10:{
                            hc=")";
                            break;
                        }
                        default:{
                            hc="?";
                            break;
                        }
                    }
                    if(ans.size()>=s11.size())
                        ans.insert(sss[ak[i]].size(),hc);
                    else
                        ans.insert(ans.size(),hc);
                    printf("%s:\n%s\n",ss[ak[i]].c_str(),ans.c_str());
                    fprintf(l,"%s,%s\n",ss[ak[i]].c_str(),ans.c_str());
                }
                break;
            }
        }
        return ;
    }
    int main(){
        HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
        CONSOLE_CURSOR_INFO CursorInfo;
        GetConsoleCursorInfo(handle,&CursorInfo);//获取控制台光标信息     CursorInfo.bVisible = false; //隐藏控制台光标
        SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态
        srand((unsigned)time(NULL));
        char ch='.',s[51];
        for(int i=0;i<=50;i++)
            s[i]=' ';
        int now=1,g=6;
        string ss[51];
        ss[1]="  纯随机强密码";
        ss[2]="  生日组合强密码";
        ss[3]="  姓名组合强密码";
        ss[4]="  一句话组合强密码";
        ss[5]="  自己输入无序字符串进行组合强密码";
        ss[6]="  众多网站批量生成同样规律的强密码";
        while(ch!='j'){
            printf("欢迎使用密码生成器\n");
            printf("请选择生成密码类型:w s上下控制,j确定 (请先将输入模式调整为英文)\n\n");
            s[now]='>';
            for(int i=1;i<=g;i++)
                printf("   %c%s\n",s[i],ss[i].c_str());//cout<<"   "<<s[i]<<ss[i]<<endl;
            ch=getch();
            system("cls");
            switch(ch){
                case 'w':{
                    s[now]=' ';
                    now--;
                    if(now==0)
                        now=g;
                    break;
                }
                case 's':{
                    s[now]=' ';
                    now++;
                    if(now==g+1)
                        now=1;
                    break;
                }
                case 'j':break;
                default:{
                    printf("请输入'w','s'or'j'  谢谢合作!");
                    Sleep(1000);
                    system("cls");
                    break;
                }
            }
        }
        switch(now){
            case 1:{
                sj();
                break;
            }
            case 2:{
                sr();
                break;
            }
            case 3:{
                mz(3);
                break;
            }
            case 4:{
                mz(4);
                break;
            }
            case 5:{
                self(5);
                break;
            }
            case 6:{
                self(6);
                pl();
                break;
            }
        }
        printf("\n\n\n\a感谢使用此密码生成器,最终解释权归吴同学所有!\n\n窗口将在10秒后自动关闭\r");
        for(int i=9;i>=0;i--){
            Sleep(1000);
            printf("窗口将在%2d秒后自动关闭\r",i);
        }
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月5日
  • 已采纳回答 10月28日
  • 创建了问题 10月28日

悬赏问题

  • ¥15 C++识别堆叠物体异常
  • ¥15 音量自动减小啦!日历自动翻页
  • ¥15 微软硬件驱动认证账号申请
  • ¥15 有人知道怎么在R语言里下载Git上的miceco这个包吗
  • ¥15 GPT写作提示指令词
  • ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等
  • ¥20 关于DAC输出1.000V对分辨率和精度的要求
  • ¥15 华为超融合部署环境下RedHat虚拟机分区扩容问题
  • ¥15 哪位能做百度地图导航触点播报?
  • ¥15 请问GPT语言模型怎么训练?