我有以下字符串:
B #012a#016 G 6 )_#014 d%| 1401 01 000] [M00FEB11002FA] _13:40:39,08-30-2012:
我编写了这个简单的代码来获取位于|
之后的值1401问题是当我调用substr i得到分段错误时代码是这样的:
string test = "B�#012a#016�G�6�)_#014�d%|1401 01 000][M00FEB11002FA]_13:40:39,08-30-2012�:�";
int jj = test.find("]");
for (int j = jj ; j > 0 ; j--)
{
if (test.at(j) == '|')
{
test = test.substr(j+1);
test = test.substr(0,test.find_first_of(' '));
}
}
有人可以说我做错了吗?
答案 0 :(得分:5)
问题是当我调用substr i得到分段错误时代码是这样的:
没有。由于您未能处理at
引发的异常而导致分段错误被调用,因为在您第一次修改字符串之后,后续at
调用将访问字符串边界之外的索引。 / p>
如果在修改字符串后离开循环,它就可以工作。
也就是说,通过用string::rfind
替换整个外部循环,并用一个substr
替换两个int end = test.find("]");
int start = test.rfind("|", end);
test = test.substr(start + 1, test.find(' ', start) - start);
调用,可以大大简化代码:
find_first_of
(这里也需要{{1}}。)
答案 1 :(得分:3)
有两个可能的问题:
break
区块内添加if
。'\0'
相同),则字符串将只包含一个字符,即第一个'B'
。然后,如果find
调用返回有效位置,则开始循环而不检查,如果此情况为真,则实际为string::npos
。