我编写了一个创建多个随机字符串的代码。但每次我打印它时,即使每次都创建了不同的字符串,也只会打印多次最后一个字符串。任何人都可以告诉我我做错了什么。
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]);
}
答案 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
。