这个随机字符串生成器可以生成随机一个字符串,并有1/2概率生成它的翻转字符串,1/2概率生成其他字符串,可以用来判断一些字符串比较算法是否正确(如KMP算法)

代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
void RandomString(char* arrString, int elementNumbers)
{
int count = 0;
for(count = 0;count+1<elementNumbers;count++)
{
//根据ASCII表,33~126为可打印字符,所以随机生成33~126的字符
arrString[count] = rand()%94+33;
}
arrString[count] = 0;
}
void RightMoveRandomStepsString(char* arrString, int elementNumbers)
{
//这里需要elementNumbers-2,因为结尾字符为'\0',不需要翻转,
//可以理解成实际需要处理的元素个数 == elementNumbers-1,而数组下标从0开始,再减一
int rightMoveSteps = rand()%(elementNumbers-1);
int liftEdge = 0;
int rightEdge = 0;
char temporary = 0;
//printf("%d\n",rightMoveSteps);
for(liftEdge = 0,rightEdge = rightMoveSteps;liftEdge<rightEdge;liftEdge++,rightEdge--)
{
temporary = arrString[liftEdge];
arrString[liftEdge] = arrString[rightEdge];
arrString[rightEdge] = temporary;
}
for(liftEdge = rightMoveSteps+1,rightEdge = elementNumbers-2;liftEdge<rightEdge;
liftEdge++,rightEdge--)
{
temporary = arrString[liftEdge];
arrString[liftEdge] = arrString[rightEdge];
arrString[rightEdge] = temporary;
}
for(liftEdge = 0,rightEdge = elementNumbers-2;liftEdge<rightEdge;liftEdge++,rightEdge--)
{
temporary = arrString[liftEdge];
arrString[liftEdge] = arrString[rightEdge];
arrString[rightEdge] = temporary;
}
}
void RightMoveOrNot(char* arrCompare, char* arrString,int elementNumbers)
{
if(rand()%2)
{
printf("TRUE\n");
strcpy(arrCompare,arrString);
RightMoveRandomStepsString(arrCompare,elementNumbers);
}
else
{
int examPoint = rand()%(elementNumbers-1);
printf("FALSE\n");
RandomString(arrCompare,elementNumbers);
if(arrString[examPoint] == arrCompare[examPoint])
{
if(arrCompare[examPoint]<126)
{
arrCompare[examPoint]++;
}
else
{
arrCompare[examPoint]--;
}
}
}
}
void RightMoveOrNot1(char* arrCompare, char* arrString,int elementNumbers)
{
strcpy(arrCompare,arrString);
RightMoveRandomStepsString(arrCompare,elementNumbers);
if(rand()%2)
{
printf("TRUE\n");
}
else
{
int examPoint = rand()%(elementNumbers-1);
printf("FALSE\n");
if(arrCompare[examPoint]<126)
{
arrCompare[examPoint]++;
}
else
{
arrCompare[examPoint]--;
}
}
}
void Test()
{
char arrString[10] = {0};
char arrCompare[10] = {0};
RandomString(arrString,sizeof(arrString)/sizeof(arrString[0]) );
//printf("arrString : %s\n",arrString);
//arrCompare[]有1/2的概率是arrString[]的翻转字符串,有1/2的概率不是
//代码实现方法1:对arrCompare使用RandomString(),一般情况下,arrCompare与arrString差异很大
//RightMoveOrNot(arrCompare,arrString,sizeof(arrString)/sizeof(arrString[0]) );
//代码实现方法
//通过翻转arrString[]字符串得到arrCompare,在随机挑选一个位置,修改那里的数值,
//arrCompare与arrString[]的翻转字符串只有一个字符不同
RightMoveOrNot1(arrCompare,arrString,sizeof(arrString)/sizeof(arrString[0]) );
printf("arrString : %s\n",arrString);
printf("arrCompare: %s\n",arrCompare);
printf("\n");
}
int main()
{
int count = 0;
srand( (unsigned)time(NULL) );
for(count = 0;count<30;count++)
{
Test();
}
return 0;
}版权声明:本文为Cubic_Custard原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。