【问题标题】:Generate random char/digit生成随机字符/数字
【发布时间】:2018-06-23 16:59:01
【问题描述】:

我正在尝试找到生成随机数字/字符数组的最快方法。

char *randomGet(int num) {
    srand(time(NULL));
    const char ab[37] = { "0123456789ABCDEFGHIGKLMNOPQRSTUVWXYZ" };//Alphabet&Digit
    char *targ = new char[num];
    for (int i = 0; i < num; i++) {
        strcat(targ, ab[rand() % 38]);
    }
    return targ;
}

到目前为止,我已经想出了这个,但它不起作用(char 类型的参数与 const char * 类型的参数不兼容)。 帮助我找到解决问题的最佳方法。泰。

【问题讨论】:

  • 停止尝试使用strcat
  • 开始使用std::string。
  • @NeilButterworth 是的,这也可以解决内存分配中的非一错误。 :-)
  • 除了main 的开头之外,不要在任何地方调用srand(除非你知道自己在做什么,如果你试图在函数应该返回随机结果)。
  • 更好的是,使用 C++ 提供的随机工具,而不是标准 C 库中的 srand 和 rand。

标签: c++ random char digit


【解决方案1】:

strcat()char* 作为输入,但您给它一个 char,因此编译器错误。

此外,strcat() 写入的缓冲区必须以空值终止,但您的 targ 缓冲区最初并未以空值终止,并且无论如何您都没有为最终的空终止符分配足够的空间。

您根本不需要使用strcat()。由于您无论如何都在循环,只需使用循环计数器作为在缓冲区中写入的索引:

另外,在对rand() 的返回值取模时,您使用了错误的整数值。您正在生成一个随机索引,可能超出您的 ab[] 数组的范围。

试试这个:

char *randomGet(int num)
{
    srand(time(NULL));
    static const char ab[] = "0123456789ABCDEFGHIGKLMNOPQRSTUVWXYZ"; //Alphabet&Digit
    char *targ = new char[num+1];
    for (int i = 0; i < num; ++i) {
        targ[i] = ab[rand() % 36];
    }
    targ[num] = '\0';
    return targ;
}

【讨论】:

    【解决方案2】:

    我会做出两个改变。首先,将内部源数组设为静态:

    static const char ab[] = "0123456789ABCDEFGHIGKLMNOPQRSTUVWXYZ";
    

    注意这个版本没有指定数组大小;编译器会从初始化器中找出来。

    其次,传入一个指向目标数组的指针:

    void randomGet(char* targ, int num) {
        static const char ab[] = "0123456789ABCDEFGHIGKLMNOPQRSTUVWXYZ";
        for (int i = 0; i < num - 1; ++i)
            targ[i] = ab[rand() % (sizeof ab - 1)];
        targ[num - 1] = '\0';
    }
    

    这样,调用者决定如何为字符串分配内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-25
      • 2010-09-08
      • 2014-02-09
      • 2017-08-01
      • 2011-06-30
      • 1970-01-01
      相关资源
      最近更新 更多