Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用3个字符生成200个唯一的40个字符字符串_C_String_Char_Unique - Fatal编程技术网

C 使用3个字符生成200个唯一的40个字符字符串

C 使用3个字符生成200个唯一的40个字符字符串,c,string,char,unique,C,String,Char,Unique,我希望仅使用“a”、“b”或“c”生成至少200个唯一的40个字符的字符串。例如,一个好的字符串应该是“aaaa…aaaa”(40个字符)。以下是我目前的做法: charnewid[41]; sprintf(newid,“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

我希望仅使用“a”、“b”或“c”生成至少200个唯一的40个字符的字符串。例如,一个好的字符串应该是“aaaa…aaaa”(40个字符)。以下是我目前的做法:

charnewid[41];
sprintf(newid,“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

另一种方法:

char newid[41];
char* pad[41] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
sprintf(newid, "%s%s\n", pad+4, "bbbb");

但我仍然不知道如何进行循环,使流程自动化。。。(对不起,我是C区的noob)。请帮忙;任何提示或方法都将不胜感激!谢谢大家!

2^64>3^40所以只需在
12157665459056928801
下面选择200个(不同的)随机64位数字,并转换为基数3(使用
a
b
c
“数字”,而不是通常的
0
1
2
)。

使用伪随机数生成器在“a”之间随机选择,“b”和“c”。要强制唯一性,请跟踪以前生成的
newid
值并丢弃重复项

#include <stdlib.h>
#include <string.h>
void generate() {
    char previous[199][40+1];
    char newid[40+1];
    int i, j, unique;
    srand(time(NULL));
    newid[40] = '\0';
    for(i=0; i < 200; i++) {
        for(j=0; j < 40; j++) {
            newid[j] = 'a' + (rand() % 3);
            }
        /* confirm newid is 'unique' */
        unique=1;   
        for(j=0; unique && j < i; j++) {
            if (strcmp(previous[j], newid) == 0)
                unique=0;
            }
        if (!unique) {
            /* discard duplicate */
            i--;
            continue;
            }
        /* save newly genererated unique value */
        strcpy(previous[i], newid);
        printf("%s\n", newid);
        }
    }
#包括
#包括
void生成(){
char-previous[199][40+1];
char-newid[40+1];
int i,j,唯一;
srand(时间(空));
newid[40]='\0';
对于(i=0;i<200;i++){
对于(j=0;j<40;j++){
newid[j]=“a”+(rand()%3);
}
/*确认newid是“唯一的”*/
唯一=1;
对于(j=0;唯一&&j
字符板[40]有足够的空间容纳39个字符长的字符串。哦,是的,我忘记了空字符。谢谢复制品的几率是否足够大,以保证对其唯一性进行检查?为什么要将其随机化?从0开始,数到199。@Jongware:哈哈,你说得对!将“different”改为斜体和括号内,我知道数字在C中存储为二进制,但如何将数字从0-199转换为“a”、“b”和“C”?我可以从二进制转换为基数3,但我不知道如何从基数3转换为字符“数字”?很抱歉,这会让人困惑……如果您可以生成一个base-3字符串,那么只需将
0
更改为
a
1
更改为
b
2
更改为
c
(实际上,确切的顺序并不重要……)@pmg没有提到结果base-3字符串可能少于200个字符——前导零会自动删除——因此请确保填充字符串。+1感谢您提供此解决方案!看到另一个实现非常酷。很遗憾,我无法在此文件中使用rand()。如果您不介意我问一下,当您这样做时会发生什么(rand()%3)?我不知道我们可以修改字符。
(rand()%3)
将返回一个介于0和2之间的随机数,将ascii值“a”相加,从而在“a”、“b”和“c”之间产生一个随机字符。为什么不能使用rand()?为了确保在笨拙的字符集中正常工作,请使用
“abc”[rand()%3]
哦,这很聪明!但是,如果字符不是方便的“a”、“b”或“c”(例如“a”和“x”),会发生什么呢?我正在处理的文件没有std库,我无法修改该部分:(我从未遇到过不提供PRNG(伪随机数生成)功能的平台。无论您是为哪个平台编程,请检查api/sdk以获得适当的替换。其次,如果您希望更改有效字符的域,请将它们放入数组中,并将随机数作为此数组的下标。