substr导致分段错误

时间:2012-08-30 10:43:31

标签: c++ linux string

我有以下字符串:

  

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(' '));
    }
}

有人可以说我做错了吗?

2 个答案:

答案 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)

有两个可能的问题:

  1. 当您找到所需的部件时,继续循环,但现在使用与您开始时不同的字符串。在break区块内添加if
  2. 如果不可打印的字符为零(与'\0'相同),则字符串将只包含一个字符,即第一个'B'。然后,如果find调用返回有效位置,则开始循环而不检查,如果此情况为真,则实际为string::npos