2015-08-08 54 views
-1

我想写一个简短而愚蠢的方程分析器,并且需要围绕给定的运算符分割字符串。我可以通过做在C++左边的分割字符串

return std::string(oprtr + 1, equ.end()); 

其中EQU是字符串,oprtr是我需要从分割位置的迭代器分离出来的字符串的右侧。这样完美的作品,但分裂断左侧,但并不:

return std::string(equ.begin(), oprtr - 1); 
==== 
terminate called after throwing an instance of 'std::length_error' 
    what(): basic_string::_S_create 

我已经试过各种我是真的不值得骄傲的其他讨厌的解决方法,如

return equ.substr(0, std::distance(equ.begin(), oprtr)); 

这一个不会给出错误,但实际上只是返回整个方程。我在这里做错了什么?

+0

没有足够的代码来弄清楚。什么是oprtr? – MSalters

+0

oprtr是我需要从中拆分的位置的迭代器。对不起,我会将其添加到问题文本中。 – Sourec

+1

'返回std :: string(equ.begin(),oprtr);'和'返回std :: string(oprtr + 1,equ.end());'看起来对我很正确。不知道为什么你想从你的最终位置减去一个。 – john

回答

1

看来你是做这样

void my_func(string equ, string::iterator oprtr) 
{ 
    string left = std::string(equ.begin(), oprtr); 
} 

string::iterator oprtr = equ.find('='); 
my_func(equ, oprtr); 

的东西,不会因为my_func你的工作有两个迭代器到不同的字符串。因为当您拨打my_func时,原始字符串会被复制。

一种解决方法是通过参考

void my_func(string& equ, string::iterator oprtr) 

另一个解决办法是使用整数代替迭代器通过。整数不像迭代器那样绑定到一个特定的字符串实例。

+0

这样做,谢谢。我不知道我是怎么错过的,我想这只是没有跨过我的脑海,因为分裂到正确的工作使用相同的技术。非常感谢! – Sourec

2

工作对我来说与g++ 4.8.2

#include <string> 
#include <algorithm> 
#include <iostream> 

int main() { 

    std::string eq("a+b=c"); 

    std::string::iterator opit = std::find(eq.begin(),eq.end(),'='); 

    std::string lhs = std::string(eq.begin(),opit); 

    std::cout << "lhs: " << lhs << "\n"; 

    return 0; 
} 

输出是: lhs: a+b

+0

因此,这也适用于我,但它使用了我以前尝试过的完全相同的事情,与构造函数进行拼接......但不知何故,这种方法没有抛出错误。我必须假设它与std :: find()有关,但不幸的是,这不适用于我的情况,整个事情实际上是在一个函数中,迭代器和字符串作为参数传入。 – Sourec

+0

所以这就是线索,你正在传递迭代器和迭代器指向的字符串**拷贝**。您需要原始字符串,而不是副本。通过参考传递。 – john

+0

@Sourec你应该真的发布一个演示错误的最小工作示例。好的,约翰的提示是真实的。如果你传递'std :: string',你会得到一个副本,但迭代器是原始字符串。你应该使用参数类型'std :: string&'传递原始字符串。 – Tobias