【问题标题】:C++ Segmentation fault when running my random ID generation运行我的随机 ID 生成时出现 C++ 分段错误
【发布时间】:2013-11-13 06:04:55
【问题描述】:

当我调用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

【问题讨论】:

  • simonc 的回答很好,但我可以建议您学习使用 Valgrind 或 GDB 等工具吗?基础知识很容易掌握(这就是您所需要的,真的),它可以为您节省大量时间来尝试在代码中查找此类错误。

标签: c++ string random stdstring


【解决方案1】:

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

v[i] = randomIDChar();

访问超出向量的末端。您可以将其更改为

v.push_back(randomIDChar());

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

【讨论】:

  • 谢谢!现在就试试!感谢您的快速回复:D
  • 效果很好!谢谢!现在我只需要弄清楚我在整个字符串中生成相同字符时做错了什么^^
  • @N00byEdge 很高兴它有帮助。我已经更新了我的答案,以涵盖为什么您没有生成随机字符。
  • 另外,for 循环和randomIDChar() 中的return 1 完全没用,因为函数在第一次进入循环时返回。我什至无法猜测你想在这里实现什么。
  • return 1 在我构建函数之前就在那里,忘记删除它;)
【解决方案2】:
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++?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 2013-09-13
    • 1970-01-01
    • 2013-04-24
    • 2021-04-14
    相关资源
    最近更新 更多