当我拨打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
答案 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++?