我正在尝试创建一个名称生成器,它使用从三个不同阵列访问的预设音节.
#include "main.hpp"
Namegen::Namegen() {
}
const char *Namegen::getFirst() {
const char *name;
int rNum = rng->getInt(0, 5);
const char *firstSyllable = start[rNum];
rNum = rng->getInt(0, 5);
const char *secondSyllable = mid[rNum];
rNum = rng->getInt(0, 5);
const char *lastSyllable = end[rNum];
name = firstSyllable + *secondSyllable + *lastSyllable;
return name;
}
Run Code Online (Sandbox Code Playgroud)
每个数组总共有6个音节,因此我将min设置为0,最大值设置为5.总共有6个数字.然而,出于某种原因,看起来它在某处产生了8?我不完全确定异常是在谈论什么,但希望其他人这样做.这是例外(即使它已经在标题中):
0xC0000005: Access violation reading location 0x0000000000000008.
Run Code Online (Sandbox Code Playgroud)
这是我的Namegen.hpp文件(通过main.hpp文件链接):
#pragma once
class Namegen {
public:
const char *start[6] = { "Ba", "Ce", "Ti", "Mo", "Lu", "Dy" };
const char *mid[6] = { "ma", "te", "di", "so", "ku", "ly" };
const char *end[6] = { "ban", "can", "dan", "fan", "gan", "han" };
Namegen();
TCODRandom *rng;
const char *getFirst();
};
Run Code Online (Sandbox Code Playgroud)
为什么抛出此异常,我该如何解决?
我明白了我可以使用以下代码成功连接值:
std::string Namegen::getName() {
int r = rng->getInt(0, 2);
std::string firstSyll = fSyll[r];
r = rng->getInt(0, 2);
std::string midSyll = mSyll[r];
r = rng->getInt(0, 2);
std::string lastSyll = lSyll[r];
std::string name = std::string(firstSyll) + std::string(midSyll) + std::string(lastSyll);
return name;
}
Run Code Online (Sandbox Code Playgroud)
但是,它现在抛出此异常:
Exception thrown at 0x00007FF978AD9E7A (ucrtbased.dll) in AotDK.exe: 0xC0000005: Access violation reading location 0x0000000000000000.
Run Code Online (Sandbox Code Playgroud)
name = firstSyllable + *secondSyllable + *lastSyllable;
是无处附近的串联.(编译器会编译它,因为它认为你正在做一些指针算法firstSyllable
.)行为实际上是未定义的,因为你要分配一些不是nullptr
或者对象的地址name
.
丢弃所有char*
东西,然后使用std::string
.然后+
将充当连接,因为它是字符串类中的重载运算符.
然后,您的数据将采用该表格
std::vector<std::string> start = { "Ba", "Ce", "Ti", "Mo", "Lu", "Dy" };
Run Code Online (Sandbox Code Playgroud)
这展示了C++标准库的强大功能.您需要#include <string>
并#include <vector>
引入该功能.