生成固定长度的随机字符串(使用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
我想生成 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