【问题标题】:Generating random strings of fixed length(using C)生成固定长度的随机字符串(使用C)
【发布时间】:2021-03-15 16:53:14
【问题描述】:

我想生成 10 个唯一的字符串,每个字符串都打印在每行上,大小为 10。我已经制作了一个单独的函数来获取随机字符 - get_random_char() 并将它们存储在 temp 中,但是我得到了一个不需要的输出。

以下是我的方法:

    #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','\0'
    };

    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

【问题讨论】:

  • 强制:如果你想做任何与密码学相关的事情,不要使用rand。更好的是,永远不要使用rand
  • 非常感谢,这真的很有帮助!

标签: c random-seed


【解决方案1】:

在c中,字符串由空字符终止。所以如果你想要10个可见字符,你需要分配11个字节,最后一个字节是字符'\0'

【讨论】:

  • 无法获得您,我应该在哪里进行更改? span>
  • 当你构造你的“随机字符串”时,数组中的最后一个字符必须是'\0'
【解决方案2】:

另一种让事情变得更简单的方法是将 10x11 2D 数组初始化为从零开始(因此您确保在每个 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]);
}

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

使用/输出示例

$ ./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

【讨论】:

  • 非常感谢!!这种方法似乎更容易。
  • 有时保持简单是要走的路。祝你编码好运!为了提高可读性,您可以使用字符文字作为偏移量,例如randstrs[j][i] = rand() % 26 + 'A';
猜你喜欢
  • 2015-09-13
  • 1970-01-01
  • 2012-02-13
  • 1970-01-01
  • 2019-01-05
  • 2018-01-25
  • 2020-03-11
  • 2012-02-13
  • 1970-01-01
相关资源
最近更新 更多