-1

私は次の文字列を持っています:

B�#012a#016�G�6�)_#014�d%| 140101 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をに置き換え、2つのsubstr呼び出しを1つの呼び出しに置き換えることで、コードを大幅に簡略化できます。

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

考えられる問題は2つあります。

  1. 探しているパーツが見つかると、ループを続けますが、最初とは異なる文字列になります。ブロックbreak内に追加します。if
  2. 印刷できない文字がゼロ(と同じ'\0')の場合、文字列には最初の1文字のみが含まれます'B'。次に、呼び出しが有効な位置を返すかどうかを確認せずにループを開始します。実際には、この場合が当てはまります。findstring::npos
于 2012-08-30T10:50:19.587 に答える