我正在尝试使用我在另一台将字符串拆分为标记的计算机上编写的代码.这段代码编译得很好.该代码也可以在其他一些计算机上运行.我已设法将代码减少到以下内容:
#include <string>
#include <boost/regex.hpp>
typedef std::vector<std::string> token_t ;
token_t generate_tokens(std::string raw_input){
//this function breaks a input string into tokens. So test 100 goes to 2 tokens "test" and "100".
boost::regex re_splitter("\\s+"); //this uses the regex \s+ to find whitespace. The + finds one or more whitespace characters.
boost::sregex_token_iterator iter(raw_input.begin(), raw_input.end(), re_splitter, -1);
//this breaks the string using the regex re_splitter to split into tokens when that is found.
boost::sregex_token_iterator j; //This is actually in the Boost examples, j is the equivalent of end. Yes this did also seem weird to me at first...
token_t token_vector;
unsigned int count = 0;
while(iter != j)
{
token_vector.push_back(*iter);
std::cout << *iter++ << std::endl;
++count;
}
return token_vector;
}
int main(){
std::string in;
int amount = -1;
std::cout << "action: ";
std::getline(std::cin, in);
boost::regex EXPR("^test \\d*(\\.\\d{1,2})?$");
bool format_matches = boost::regex_match(in, EXPR);
token_t tokens = generate_tokens(in);
if(format_matches){
amount = atoi(tokens.at(1).c_str());
}
std::cout << "amount: " << amount << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这使用以下命令编译时没有错误或警告:g++ -Wall test.cpp -lboost_regex
但是在运行时使用时提供输入test 100程序失败.
行动:测试100
a.out:/usr/local/include/boost/smart_ptr/shared_ptr.hpp:412:typename boost :: detail :: shared_ptr_traits :: reference boost :: shared_ptr :: operator*()const [with T = boost :: regex_traits_wrapper >>]:断言`px!= 0'失败.
中止
我完全迷失了这里发生的事情.这是我的代码或库中的错误吗?任何有关调试的建议都非常感谢!
小智 8
那不是错误.它是boost头文件的冲突.
这可能是因为文件包含错误,或者包含错误的库(正则表达式模块是少数需要编译的boost模块之一).
您应该使用-l和-I开关确保使用正确的文件,例如:
g++ -W -Wall main.cpp $(LDFLAGS) -lboost_regex -I/data1/PROJECT_SEARCH/libsrc/boost_1_46_1
Run Code Online (Sandbox Code Playgroud)
Pau*_*oke -1
由于您没有shared_ptr在代码中使用,并且我看不到其他看起来错误的东西并且它可以在其他机器上运行,所以我想说这可能是 Boost.Regex 中的错误。
我打赌其他机器也安装了其他版本的boost?
如果我必须猜测的话,我会std::cout << *iter++ << std::endl;先尝试改变线路。-> std::cout << *iter << std::endl; ++iter;。
是的,像 Swiss 建议的那样在调试器中运行它,并查看断言在哪里被触发。
| 归档时间: |
|
| 查看次数: |
2532 次 |
| 最近记录: |