【问题标题】:Creating multiple random strings in C在 C 中创建多个随机字符串
【发布时间】:2014-10-26 16:35:51
【问题描述】:

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

    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]);
}

【问题讨论】:

  • *b=(char*)malloc(sizeof(char*)*10); 更改为b[j]=(char*)malloc(sizeof(char*)*10);
  • 不要使用rand。永远。

标签: c string random


【解决方案1】:

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

s 是一个指向字符数组的指针。通过赋值b[j] = s;,您只分配b[j] 的指针(内存位置)s,而不是s 的内容。由于s 的内存位置没有改变,b 的所有条目都包含对同一字符串s 的相同引用,该字符串已多次更改。要将s的当前内容复制到b[j],使用strcpy(),像这样。

strcpy(b[j], s);

【讨论】:

  • 不错。我没有注意到b[j] = s;strcpy 将完成这项工作。
【解决方案2】:

我认为你应该阅读man 3 rand

事实上,您必须在应用程序开始时调用一次 void srand(unsigned int seed); 来“播种”您的 rand

【讨论】:

    【解决方案3】:

    首先,做例如*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

    【讨论】:

      猜你喜欢
      • 2021-02-21
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 2015-09-13
      • 1970-01-01
      • 2011-02-14
      相关资源
      最近更新 更多