В некоторых случаях желательно прервать повторение цикла, проанализировав какие-то условия внутри него. Это может потребоваться в тех случаях, когда проверки условия окончания цикла громоздкие, требуют многоэтапного сравнения и сопоставления каких-то данных и все эти проверки просто невозможно разместить в выражении условия операторов for, do или while.
Один из возможных вариантов решения этой задачи это ввести в код какой-то флаг окончания (переменную). При выполнении всех условий окончания этой переменной присваивается некоторое условное значение. Тогда условие в операторах for, do или while сводится к проверке, не равно ли значение этого флага принятому условному значению.
Другой способ решения задачи использование оператора break. Он используется как в операторах цикла, так и в структурах switch. Оператор break прерывает выполнение тела любого цикла for, do или while и передает управление следующему за циклом выполняемому оператору. Например:
while(!feof(F))
{
fgets(S, 256, F);
if(strstr(S, SKey.c_str()) != NULL) break;
}
Еще один способ прерывания цикла использование оператора goto, передающего управление какому-то оператору, расположенному вне тела цикла. Для прерывания циклов, размещенных в функциях, можно воспользоваться оператором return. В отличие от оператора break, оператор return прервет не только выполнение цикла, но и выполнение той функции, в которой расположен цикл.
Прервать выполнение цикла, а заодно и блока, в котором расположен цикл, можно также генерацией какого-то исключения. Наиболее часто в этих целях используется процедура Abort, генерирующая «молчаливое» исключение, не связанное с каким-то сообщением об ошибке.
Имеется еще процедура Continue, которая прерывает только выполнение текущей итерации, текущего выполнения тела цикла и передает управление на следующую итерацию. Пусть, например, нужно найти заданный фрагмент не в любой строке файла, а только в такой, которая начинается с символа "*". Тогда поиск можно было бы организовать следующим образом:
while(!feof(F))
{
fgets(S, 256, F);
if(S[0] != '*') continue;
if(strstr(S, SKey.c_str()) != NULL) break;
}
В этом варианте при первом символе в строке, отличном от "*", текущая итерация прерывается и поиск в такой строке не производится. Таким образом, не тратится время на выполнение функции strstr для строк, в которых искать фрагмент не нужно.