使用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们的帮助~


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