2013-02-27 8 views
-2

이것은 누군가 elses 코드입니다! 문자열에 대한 범위를 벗어나는 값을 얻으면 자동으로 복구됩니다. 어떻게 가능한지 알고 싶습니까? str.length()를 확인하지 않고! 승인.범위를 벗어날 때 자동 문자열 복구

범위를 벗어난 경우 자동으로 어떻게 복구합니까? 나는 누군가가 elses 코드를 이해하려고 노력하고 있는데, 시작/n = 134이고 str.length()도 134 (0-133) 일 때와 같은 것입니다.

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

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

예외 처리를 의미합니까? {...} 잡으려고 (...) {...} 시도해야합니다 ... http://www.cplusplus.com/doc/tutorial/exceptions/ – mtahmed

+0

프로그램이 중단되고 그것으로부터 회복하려고 노력하고 있습니까? –

+0

내가 이런 식으로 뭔가를 쓸 때 충돌이 일어난다. 그러나 이것은 누군가 elses 코드이고 그것은 범람하지 않거나 경고를 보내지 않는다. ... 그것은 단지 회복되어 else 문을 실행한다. 그것이 어떻게 가능한지 알고 싶습니까? –

답변

0

무슨 일이 일어 났는지 알아 냈습니다.이 작은 코드 인 것 같습니다 ... win32 앱에서 오류를 파일로 보내고 std :: string을 "recover"/ 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); 
+0

이 방법이 작동하면 버그이기 때문에 버그를 찾기가 훨씬 어려워집니다. –

+0

그것은 작동하지 않습니다, 버그에 대해 잘 모릅니다. 그러나 단지 영리한 범위를 벗어나면 정상적으로 실패합니다. –

3

인수를 문자열 길이와 비교하는 것은 어떻습니까?


if (start >= str.length()) 
    return; 
당신이 예외에 대해서 이야기하는 경우

, 당신은 예외를 catch해야합니다. 그러나 배열 인덱싱 메서드를 사용하는 경우에는 실제로 예외가 발생하지 않으므로이 메서드는 작동하지 않습니다. 이 충돌로 이어질 수있는 정의되지 않은 동작이 발생합니다.

어느 위와 같이 체크를 사용, 또는 변화는 문자를 얻기 위해 std::string::at 기능을 사용하여 예외를 잡기 위해 try and catch를 사용합니다.

+0

이것은 누군가를 이해하려고 시도하는 사람의 elses 코드 임, 내가 쓴 것은 내가해야 할 일이다 .... str [n]은 예외를 던지지만 자동으로 else 문을 복구하고 실행한다. –

+0

@ KadeerSicario-Johnson 예외를 잡아라. 다른 진술을합니까? –

+0

내 코드가 아니므로 필자가 str.length 등을 확인하지 않고 자동으로 복구 할 수있는 방법을 이해하려고합니다. –

0

std::string의 범위를 벗어나는 액세스는 operator[]으로 정의되지 않은 동작입니다. 사실 코드에서 충돌이 발생하지 않고 코드에서 충돌하는 것은 단지 우연입니다.

+0

크래시가 발생하지 않아 "문자열 아래 첨자가 범위를 벗어났습니다"라는 경고 메시지와 옵션을 중단하고 무시합니다.내 경우에 오류가 파일로 리디렉션되고 str [toohighvalue]가 false를 반환하여 –

+0

@ KadeerSicario-Johnson과 관계없이 계속 수행 할 수있게되었습니다. 아마도 추가 디버깅 검사를 제공하는 문자열 라이브러리로 빌드되고있을 것입니다. –

+0

그렇지 않으면 오류를 리디렉션하고 stdin :: string이 자체적으로 복구 할 수 있도록 해주는 _CrtSetReport 플래그 일뿐입니다. –

관련 문제