生成固定长度的随机字符串(使用C)

Generating random strings of fixed length(using C)

我想生成 10 个唯一的字符串,每行打印的大小为 10。我已经创建了一个单独的函数来获取随机字符 - get_random_char() 并将它们存储在临时文件中,但我得到了不希望的输出。

以下是我的做法:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    static const char alpha[]={
      'A','B','C','D','E','F','G','H','I','J','K','L','M','N',
      'O','P','Q','R','S','T','U','V','W','X','Y','Z','[=10=]'
    };

    char get_random_char()
    {
        int alpha_size=sizeof(alpha)-1;
        char A[10];
        return alpha[rand() % alpha_size];
    }

    int main()
    {
        srand(time(NULL));
        char str[10][10];
        char A[10],temp[10][10];
        int j;
        
        for(int i=0;i<10;i++)
        {
            for(int q=0;q<10;q++)
            {
                temp[i][q]=get_random_char();
            }
            for( j=0;j<=i-1;j++)
            {
                if(strcmp(str[j],temp[i])==0)
                break;
                
            }
            if(i==j)
            {
                strcpy(str[i],temp[i]);
            }
            else
                i--;
        }
        for(int p=0;p<10;p++)
        {
            printf("%s\n",str[p]);
            //printf("\n");
        }
        return 0;
    }

输出:

LTOJMGAPMRLZSDECCFTJTLWEFRVFGWURSLBERDVDUIDOLHRPPKZIYVNFMIKSEHLWSOCJRXOOHRCVBTKQGJYGGNLSVVMCEAYWODHI
LZSDECCFTJTLWEFRVFGWURSLBERDVDUIDOLHRPPKZIYVNFMIKSEHLWSOCJRXOOHRCVBTKQGJYGGNLSVVMCEAYWODHI
TLWEFRVFGWURSLBERDVDUIDOLHRPPKZIYVNFMIKSEHLWSOCJRXOOHRCVBTKQGJYGGNLSVVMCEAYWODHI
URSLBERDVDUIDOLHRPPKZIYVNFMIKSEHLWSOCJRXOOHRCVBTKQGJYGGNLSVVMCEAYWODHI
UIDOLHRPPKZIYVNFMIKSEHLWSOCJRXOOHRCVBTKQGJYGGNLSVVMCEAYWODHI
ZIYVNFMIKSEHLWSOCJRXOOHRCVBTKQGJYGGNLSVVMCEAYWODHI
EHLWSOCJRXOOHRCVBTKQGJYGGNLSVVMCEAYWODHI
OOHRCVBTKQGJYGGNLSVVMCEAYWODHI
GJYGGNLSVVMCEAYWODHI
MCEAYWODHI

在c中,字符串以空字符结束。所以如果你想要10个可见字符,你需要分配11个字节,最后一个字节是字符'[=10=]'.

另一种让事情变得更简单的方法是将你的 10x11 二维数组初始化为全零开始(所以你确保在每个 10 个字符之后有一个 nul-terminating 字符细绳)。然后用你范围内的随机字符(全部大写)以某种合理的方式填充你的数组,例如

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main (void) {
    
    char randstrs[10][11] = {{0}};                  /* 2D array initialized all zero */
    
    srand (time(NULL));                             /* seed random number geenrator */
    
    for (int i = 0; i < 10; i++)                    /* fill 2D array columnwise */
        for (int j = 0; j < 10; j++)
            randstrs[j][i] = rand() % 26 + 65;      /* upper case characters */
            // randstrs[j][i] = rand() % 95 + 32;      /* all printable chars */
    
    for (int i = 0; i < 10; i++)                    /* output results */
        printf ("%s\n", randstrs[i]);
}

上面的代码填充字符列而不是字符串。只是简单地按顺序填充每个字符串的一种替代方法。

例子Use/Output

$ ./bin/randstr_10
ARGNXRHMVD
VPPDFXTAJX
TAVNFDWNKB
BXPJXOWRBA
HYVECMEZZV
IIXWFYBRYF
TVDRHLUWZD
PJFZZPWHKQ
WHDLOEAQNB
YSSOORINFF

如果您使用所有可打印 ASCII 字符的范围,您将得到类似于:

$ ./bin/randstr_10
Q]xSqIPCdo
],1GoPzYde
2S8>D^)m `
g<}eE_ngCu
]p=/,K`~DQ
ft,{6{5vK>
E<DI:kg}=,
<ANTFl*7-9
q8x5WGf=5I
@#c;Pa|Rdr