#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
#include <math.h>
#define RAND(MIN,MAX) (((unsigned long long)rand() * (MAX - MIN + 1)) >> 15 + MIN)
const char broke[]="ptkcbdg";
const char ddw[]="bb""cc""dd""ee""ll""mm""nn""oo""pp""rr""ss""tt";
//const char ddw[][2]={"bb","cc","dd","ee","ll","mm","nn","oo","pp","rr","ss","tt"};
int main()
{
/*整理一下爆破音*/
int boklen = strlen(broke);
/*
AaronAbbottAbelAbnerAbrahamAdairAdamAdolphAdonisAlanAlbertAldrichAlexanderAlfredAlgerAllenAlstonAlvaAlvinAlvisAmosAndreAndrewAndyAngeloAugusAnselAntonyAntonioArcherArchibaldAriesArlenArmandArmstrongArnoArthurArvinAsaAtwoodAubreyAugustAugustineAveryBairdBaldwinBardBarlowBarnettBaronBarretBarryBartholomewBartBartonBasilBeacherBeauBeckBenBenedictBenjaminBennettBensonBergBernardBernieBertBertonBertramBevisBillBingBishopBlairBlakeBlitheBobBoothBorgBorisBowenBoyceBoydBradleyBradyBrandonBrianBroderickBrookBruceBrunoBuckBurgessBurkeBurnellBurtonByronCaesarCalvinCareyCarlCarrCarterCashCecilCedricChadChanningChapmanCharlesChaselChesterChristChristianChristopherClareClarenceClarkClaudeClementClevelandCliffClydeColbertColbyColinConradCoreyCorneliusCornellCuritisCyrilDanaDanielDarcyDarnellDarrenDaveDavidDeanDempseyDennisDerrickDevinDickDominicDonDonahueDonaldDouglasDrewDukeDuncanDunnDwightDylanEarlEdEdenEdgarEdmundEdisonEdwardEdwiinEgbertEliElijahElliotEllisElmerElroyEltonElvisEmmanuelEnochEricErnestEugeneEvanEverleyFabianFelixFerdinandFitchFordFrancisFrankFranklinFredericGabrielGaleGaryGavinGeneGeoffreyGeorgeGeraldGilbertGilesGlennGodferyGordonGregGregaryGriffithGroverGustaveGuyHaleHaleyHamiltionHardyHarlanHarleyHaroldHarryHarveyHaydenHenryHerbertHermanHilaryHiramHobartHoganHoraceHowarHuberyHughHugoHumphreyHunterHymanIanIngemarIngramIraIsaacIsidoreIvanIvesJackJacobJamesJaredJasonJayJeffJeffreyJeremyJeromeJerryJesseJimJoJohnJonasJonathanJosephJoshuaJoyceJulianJuliusJustinKeithKellyKenKennedyKennethKentKerrKerwinKevinKimKingKirkKyleLambertLanceLarryLawrenceLeifLenLennonLeoLeonardLeopoldLesLesterLeviLewisLionelLouLouisLucienLutherLyndonLynnMageeMalcolmMandelMarcusMaricoMarkMarlonMarshMarshallMartinMarvinMattMatthewMauriceMaxMaxwellMeredithMerleMerlinMichaelMichellMickMikeMilesMiloMonroeMontagueMooreMorganMortimerMortonMosesMurphyMurrayMyronNatNathanNathanielNeilNelsonNewmanNicholasNickNigelNoahNoelNormanNortonOgdenOliverOmarOrvilleOsbornOscarOswaldOtisOttoOwenPageParkerPaddyPetricPaulPaynePerryPetePeterPhilPhilipPorterPrimoQuentinQuincyQuinnQuintionRachelRalapRandolphRaymondRegReganReginaldReubenRexRichardRobertRobinRockRodRoderickRodneyRonRonaldRoryRoyRudolfRupertRyanSamSampsonSamuelSandySaxonScottSeanSebastianSidSidonSidneySidonSimonSolomonSpencerStanStanfordStanleyStevenStewardTabTaylorTedTernenceTheobaldTheodoreThomasTiffanyTimTobyToddTomTonyTracyTroyTrumanTylerTyroneUlyssesUptonUriahValentineValentineVerneVicVictorVincentVirgilVitoVivianWadeWalkerWalterWarddreammakerWarnerWayneWebbWebsterWendellWernerWilburWillWilliamWillieWinfredWinstonWoodrowWordsworthWrightXavierYaleYehudiYorkYvesZacharyZebulonZer
*/
FILE *frp = NULL;
char *ibuff=NULL;
char *obuff=NULL;
frp = fopen("./output_manname_noAA.txt", "r");
/*判断文件大小*/
fseek(frp, 0, SEEK_END);
int len = ftell(frp);
printf("length is %ld\r\n\r\n", len);
fseek(frp, 0, SEEK_SET);
ibuff=(char*)malloc(len*sizeof(char)+1);
fscanf(frp, "%s", ibuff);
//printf("%s\n", ibuff );
fclose(frp);
/*统计ibuff中大写字母数量(单词数量)*/
int cnt=0;
for(char *tmp=ibuff; 0!=*tmp; tmp++) if(isupper(*tmp)) cnt++;
unsigned malloc_size=len*sizeof(char)+1/*+cnt*/+cnt;
obuff=(char*)malloc(malloc_size);
/*ibuff中单词划入二维数组name[][]*/
char** name = NULL;
malloc_size = cnt * sizeof(char*);
name = (char**)malloc(malloc_size);
char** ntmp = name;
/*嵌入结束符0,完成二维数组的搭建*/
char *itmp=ibuff;
char *otmp=obuff;
*ntmp=otmp;
ntmp++;
*otmp=*itmp;
itmp++;
otmp++;
while(0!=*itmp)
{
if(isupper(*itmp))
{
// *otmp='\r';
// otmp++;
*otmp=0;
otmp++;
*ntmp=otmp;
ntmp++;
}
*otmp=*itmp;
itmp++;
otmp++;
}
/*ibuff任务结束*/
free(ibuff);
//for(int i=0; i<cnt; i++) puts(*(name+i));
printf("cnt==%d\r\n\r\n",cnt);
/*假定一个名字长度为4*/
char relen=4;
unsigned char enname;
volatile unsigned int seed = (unsigned)time(NULL);
while(1)
{
/*1-6方便摇色子决定*/
for (int k = 1; k <= 6; k++)
{
char enlen=relen + k/2;
char output[10]= {0};
int bokcnt;
int bok[2];
do
{
for (int i = 0; i < enlen; i++)
{
do
{
srand((unsigned)time(NULL) + pow(seed,2));
seed++;
enname = RAND(0,cnt);
}
while(strlen(*(name+enname)) < enlen);
if(0==i) output[0]=toupper(*(*(name+enname)+0));
else output[i]=*(*(name+enname)+i);
}
bokcnt=0;
for (int i = 0; i < enlen; i++)
{
/*非合法的同字母组合*/
if(*(output+i) == *(output+i+1))
{
char ss[3]= {0};
*ss=*(output+i);
*(ss+1)=*ss;
if(NULL == strstr(ddw,ss))
{
bokcnt=100;
break;
}
}
/*多爆破或非合法的爆破组合*/
char c = *(output+i);
if(NULL != strchr(broke,c))
{
bokcnt++;
if(2 >= bokcnt) bok[bokcnt] = i;
}
}
}
while(2 < bokcnt || (1 == bok[1] - bok[0] && 2 == bokcnt));
printf(" [%d] %s\r\n",k,output);
}
getchar();
}
free(obuff);
return 0;
}