std :: string.substr运行时错误

时间:2014-02-27 01:19:33

标签: c++ string c++11 vector std

我一直致力于平衡化学方程式的程序。我有它所以它根据=将方程分为两个方面。我正在处理我的程序而且我做了一些事情,现在当我尝试将std::vector<std::string>的第一个索引设置为我的等式的substr时,我遇到了运行时错误。我需要帮助解决这个问题。

std::vector<std::string> splitEquations(std::string fullEquation)
{
    int pos = findPosition(fullEquation);
    std::vector<std::string> leftAndRightEquation;
    leftAndRightEquation.reserve(2);
    leftAndRightEquation[0] = fullEquation.substr(0, (pos)); //!!!! Error
    leftAndRightEquation[1] = fullEquation.substr( (pos+1), (fullEquation.size() - (pos)) );
    removeWhiteSpace(leftAndRightEquation);
    std::cout << leftAndRightEquation[0] << "=" << leftAndRightEquation[1] << std::endl;
    return leftAndRightEquation;
}

这是findPosition的代码。

int findPosition(std::string fullEquation)
{
    int pos = 0;
    pos = fullEquation.find("=");
    return pos;
}

3 个答案:

答案 0 :(得分:2)

错误不在substr上,而是在矢量operator[]上。当您尝试在索引0和1处分配时,向量仍为空。如果需要,它有两个保留用于扩展,但其“有效区域”的大小为零;访问它会导致错误。

您可以使用push_back来解决问题,例如:

leftAndRightEquation.push_back(fullEquation.substr(0, (pos)));
leftAndRightEquation.push_back(fullEquation.substr( (pos+1), (fullEquation.size() - (pos)) ));

答案 1 :(得分:1)

reserve()更改为resize(),它会起作用。在所有其他情况下,reserve()调用不会导致重新分配,并且矢量容量不会受影响,但resize()会影响。

答案 2 :(得分:1)

会员职能reserve

leftAndRightEquation.reserve(2);
std::vector

不会创建向量的元素。它只是为将来添加到向量的元素保留内存。

因为向量没有元素,所以你可能不会使用下标运算符。而不是它你必须使用成员函数push_back 另外,可以更简单地指定第二个子字符串。

leftAndRightEquation.push_back( fullEquation.substr( 0, pos ) );
leftAndRightEquation.push_back( fullEquation.substr( pos + 1 ) );

substr的成员函数class std::basic_string按以下方式声明

basic_string substr(size_type pos = 0, size_type n = npos) const;

它有两个带默认参数的参数。

如果你想使用下标运算符,那么你最初应该创建带有两个元素的向量。您可以通过以下方式执行此操作

std::vector<std::string> leftAndRightEquation( 2 );

之后你可以写

leftAndRightEquation[0] = fullEquation.substr( 0, pos );
leftAndRightEquation[1] = fullEquation.substr( pos + 1 );