运行随机ID生成时C ++分段错误

时间:2013-11-01 23:14:07

标签: c++ string random stdstring

当我拨打newUnitID()时,我正在收到细分错误(细分错误:11)。

不知道我做错了什么。

这是我的头文件,其中函数是:

#include <iostream>
#include <cstring>
#include <string>
#include <cstdlib>
#include <ctime>
#include <vector>
#ifndef UnitManager
#define UnitManager
using namespace std;

char randomIDChar(){
    static const char alphanum[] =
        "0123456789"
        "!@#$%^&*"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "abcdefghijklmnopqrstuvwxyz";
    int stringLength = sizeof(alphanum) - 1;
    srand(time(0));
    for(int z=0; z < 21; z++)
    {
        return alphanum[rand() % stringLength];
    }
    return 1;
}

string newUnitID(){
    vector<char> v;
    for(int i=0; i < 50; i++){
        v[i] = randomIDChar();
    }
    string str(v.begin(),v.end());
    return str;
}

#endif

2 个答案:

答案 0 :(得分:6)

vector operator []访问现有元素;它不会创建新元素。你从空矢量开始,所以

v[i] = randomIDChar();

超越矢量结束的访问。您可以将其更改为

v.push_back(randomIDChar());

请注意randomIDChar也存在问题。您应该只调用随机数生成器一次,可能在调用任一发布的函数之前。任何给定的种子都会产生可预测的“随机”数字流; time(0)会返回一个秒数,因此您在1秒内拨打的每个电话都会有相同的种子,因此当您稍后拨打rand时会生成相同的号码

答案 1 :(得分:1)

v[i] = randomIDChar();

导致未定义的行为,因为它试图在数组的边界后面写一个字符(向量的内部缓冲区,以前没有分配过)。

另请注意,您不需要使用字符向量来构建字符串,您可以直接使用std::string对象。并且还要注意,生成角色位置的方式会产生相当不正确的结果,这会产生更好的结果:

char randomIDChar(){
    static const char alphanum[] =
        "0123456789"
        "!@#$%^&*"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "abcdefghijklmnopqrstuvwxyz";
    static int len = 0;
    if (len == 0) {
        srand(time(0));
        len = sizeof(alphanum) - 1;
    }
    int pos = ((double)rand() / ((double)RAND_MAX + 1.0)) * len;
    return alphanum[pos];
}

std::string newUnitID(){
    const int LEN = 50;
    std::string str(LEN, ' ');
    for(int i = 0; i < LEN; i++) {
        str[i] = randomIDChar();
    }
    return str;
}

值得一看:What is the best way to generate random numbers in C++?