[c]从一份男性英文名txt文件中产生随机英文名

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值