【问题标题】:char* string substract function throws exceptionchar* 字符串减法函数抛出异常
【发布时间】:2015-06-23 02:58:07
【问题描述】:

我正在开发我自己的名为 PString 的字符串类,我有这个函数 找到一个特定的字符,比如 6,现在我有了这个叫做 substr short fo substract 的函数,我想从 0 减去 [insertnumber]。 我试图这样称呼它的方式是这样做:

PString string;
int to = 0;
string = "A string = a string"; // lol
string.find('=', to);
string.substr(to);

我的 find 函数很好,可以 100% 工作,但我的 substr 函数不起作用。 这是我的 substr 函数:

void PString::substr(int to) {
    char* temp = new char[255];
    temp = this->c_str();
    for (int i = 0; i < to; i++) {
        temp[i] = ' ';
    }
}

this->c_str() 只是返回对象持有的当前字符串,这是为了 防止失败,但我无法通过第一个 for 循环, temp[i] = ' ' 只是抛出一个异常,我完全不知道为什么。

哦,是的,我知道我的函数并没有删除 temp 和更多的东西,但这还没有实现,因为我试图让 for 循环首先工作。

通过 makign 更多功能修复编辑(从已经创建的 PString 中 makign 一个新的 PString) 还使用了 memcpy 而不是仅仅做一个简单的等号运算符

【问题讨论】:

  • “substr”是“substring”,而不是“substract”。它返回一个 new 字符串。
  • 试试strcpy(temp,c_str());...
  • @OskarDahlberg 如果您的目标是删除个字符,为什么还要创建一个新字符串?这在很多方面都是错误的。
  • string = "A string = a string";是如何实现的?您是只保存一个指向所提供字符串的指针,还是复制该字符串?

标签: c++ arrays string char


【解决方案1】:

您在这里犯的第一个明显错误是:

char* temp = new char[255];
temp = this->c_str();

您分配内存然后复制指针的值。因此,首先您会遇到内存泄漏,其次取决于您对c_str() 的实现,您正在复制您不应该更改的地址(std::stringc_str() 返回const char*)。

这是因为std::string 的实际实现实际上并不需要堆分配的数组,而且一些实现实际上在内部存储了一个小数组来存储短字符串。

所以如果你真的想创建一个新字符串,最好的办法是复制内存:

char* temp = new char[this->size()];
memcpy(temp,this->c_str(),this->size()) //I assume 8-bit string, change if you use widechars

然后你使用temp返回一个新的字符串来初始化它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多