-2

これは他の誰かのコードです!!! 文字列の範囲外の値を取得すると自動的に回復します....それがどのように可能か知りたいですか?str.length()をチェックせずに!わかった。

範囲外の場合、どのように自動的に回復しますか?start / n = 134で、str.length()も134(0-133)の場合に、他の誰かのコードが何をするのかを理解しようとしています。

FindEndOfToken(string &str, int start)
{
    UINT n = start;

    if( str[n] == '"' )
        doStuffOne();
    else
        doStuffTwo();
}
4

3 に答える 3

3

引数を文字列の長さと比較するのはどうですか?

if (start >= str.length())
    return;

例外について話している場合は、例外をキャッチする必要があります。ただし、配列のインデックス作成方法を使用している場合、これは実際には適切な例外をスローしないため機能しません。代わりに、未定義の動作が発生し、クラッシュが発生する可能性があります。

上記のチェックを使用するかstd::string::at関数を使用して文字を取得して使用trycatch、例外をキャッチするように変更します。

于 2013-02-27T14:52:41.503 に答える
0

std::stringwithの境界を超えてアクセスすることoperator[]は、未定義の動作です。彼らのコードではクラッシュせず、あなたのコードではクラッシュするという事実は偶然です。

于 2013-02-27T15:29:10.453 に答える
0

何が起こっているのかを理解しました....この小さなコードのようです...win32アプリでは、エラーをファイルに送信し、std::stringに依存して「回復​​」/無視しますlol

// Turn on memory tracking
_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF|_CRTDBG_ALLOC_MEM_DF);
_CrtSetReportMode(_CRT_ASSERT,_CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ASSERT,_CRTDBG_FILE_STDERR);
于 2013-02-27T16:16:02.060 に答える