在C中创建多个随机字符串

时间:2014-09-02 12:01:32

标签: c string random

我编写了一个创建多个随机字符串的代码。但每次我打印它时,即使每次都创建了不同的字符串,也只会打印多次最后一个字符串。任何人都可以告诉我我做错了什么。

    static const char alphanum[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz";

    char s[5],*b[5] ;

    int num =0;
    for(int j=0;j<5;j++)
    {
        *b=(char*)malloc(sizeof(char*)*10);
        for (int i = 0; i < 4; ++i)
        {
            num = rand() % (sizeof(alphanum) - 1);
            s[i] = alphanum[num];
        }

        s[4] = 0;
        printf("%s\t",s);
        b[j] = s;
    }

    for(int j=0;j<5;j++)
        printf("\n%s",b[j]);
}

3 个答案:

答案 0 :(得分:3)

假设您已经使用srand(time(NULL));播种了随机数生成器,以便在每次运行程序时生成不同的随机数序列,您的代码中还会有一个缺陷:< / p>

s是指向字符数组的指针。使用作业b[j] = s;,您只需指定b[j] s的指针(内存位置),而不指定s的内容。由于s的内存位置不会更改,因此b的所有条目都包含对同一字符串s的相同引用,该字符串已多次更改。要将s的当前内容复制到b[j],请使用strcpy(),如下所示。

strcpy(b[j], s);

答案 1 :(得分:1)

我认为你应该阅读man 3 rand

事实上,你必须在申请开始时拨打void srand(unsigned int seed);一次“种子”你的兰特

答案 2 :(得分:0)

首先,例如*b*(b + 0)相同,与b[0]相同。这意味着当您分配内存时,您始终将其分配给相同的条目。

其次,在循环的最后,你覆盖指针并使b[j]始终指向s。因此b中的所有指针都指向相同的s。这就是为什么你的所有字符串看起来都是一样的。

第三,你不需要需要在循环中动态分配,因为所有字符串都是固定大小的。而是将b声明为字符数组数组:

char b[5][5];

然后,您copy the string代替指定指针,进入b中的正确条目。


最后,以及将来参考don't cast the return of malloc