-1

我有以下字符串:

B�#012a#016�G�6�)_#014�d%|1401 01 000][M00FEB11002FA]_13:40:39,08-30-2012�:�</p>

我编写了这个简单的代码来获取位于 | 之后的值 1401。

问题是当我调用 substr 时出现分段错误,代码是这样的:

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

有人可以说我做错了什么吗?

4

2 回答 2

5

问题是当我调用 substr 时出现分段错误,代码是这样的:

不。分段错误是由您未能处理引发的异常调用的,at因为在您第一次修改字符串后,后续at调用将访问字符串边界之外的索引。

如果在字符串修改后离开循环,它会起作用。

string::rfind也就是说,通过将整个外循环替换为 ,并将两个substr调用替换为一个调用,可以大大简化代码:

int end = test.find("]");
int start = test.rfind("|", end);
test = test.substr(start + 1, test.find(' ', start) - start);

find_first_of这里也不需要。)

于 2012-08-30T10:49:54.457 回答
3

有两个可能的问题:

  1. 当你找到你正在寻找的部分时,你会继续循环,但现在使用的字符串与你开始时的不同。breakif块内添加一个。
  2. 如果不可打印字符为零(与 相同'\0'),则字符串将仅包含一个字符,即第一个'B'。然后您开始循环而不检查调用是否返回有效位置,如果这种情况为真find,它实际上将是。string::npos
于 2012-08-30T10:50:19.587 回答