2013-02-27 4 views
-2

Это код пользователя elses !!! и он автоматически восстанавливается, когда он получает значение вне диапазона для строки .... Я хочу знать, как это возможно? без проверки str.length()! ОК.автоматическое восстановление струны, когда вне допустимого диапазона

Как вы автоматически восстанавливаетесь, когда находитесь за пределами допустимого диапазона? Я пытаюсь понять кто-то код elses, так как это происходит, когда start/n = 134, а str.length() также 134 (0-133).

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

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

Вы имеете в виду обработку исключений? try {...} catch (...) {...} должен работать ... http://www.cplusplus.com/doc/tutorial/exceptions/ – mtahmed

+0

Вы говорите, что программа вылетает, и вы пытаясь оправиться от этого? –

+0

он сбой, когда я пишу что-то вроде этого, чего я ожидаю ..... но это кто-то код elses, и он не сбой или предупреждение о вызове вне диапазона .... он просто восстанавливает и запускает инструкцию else, i хотите знать, как это возможно? –

ответ

0

выяснил, что происходило .... кажется, это немного кода ... в приложении win32 он отправляет ошибку в файл и полагается на std :: string для «восстановления»/ignore 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; 

Если вы говорите об исключении, вы должны поймать исключение. Однако это не сработает, если вы используете метод индексирования массива, поскольку это фактически не вызывает правильное исключение, вместо этого оно приводит к неопределенному поведению, которое может привести к сбою.

Либо использовать проверку, как указано выше, или изменение использовать функцию std::string::at, чтобы получить символ и использовать try and catch поймать исключение.

+0

это кто-то код elses im пытается понять, что я написал, что я ожидал сделать .... str [n] выбрасывает исключение, но автоматически восстанавливает и запускает оператор else –

+0

@ KadeerSicario-Johnson Поймай исключение и сделать другое заявление? –

+0

не мой код, я пытаюсь понять, как человек, который его написал, может автоматически восстановить его без проверки str.length и т. Д. –

0

Доступ за пределы std::string с operator[] - это неопределенное поведение. Дело в том, что в их коде это случается не сбой, а в вашем коде он падает только случайно.

+0

он не сбой, он дает вам (обычно) всплывающее окно с предупреждением о «строчном индексе вне диапазона» и вариантах отмены, игнорирования ...в моем случае ошибка перенаправлялась к файлу, а str [toohighvalue] возвращал ложное значение, которое позволяло ему выполнять независимо от –

+0

@ KadeerSicario-Johnson: возможно, он строится с помощью строковой библиотеки, которая обеспечивает дополнительные проверки отладки. –

+0

nah это были только флаги _CrtSetReport, которые перенаправляли ошибку и позволяли stdin :: string восстанавливать сам по себе –

Смежные вопросы