C语言小项目-随机字符串生成器

 这个随机字符串生成器可以生成随机一个字符串,并有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版权协议,转载请附上原文出处链接和本声明。