2013-11-13 9 views
0

Есть ли способ вырваться из бесконечного цикла во время его работы без использования Ctrl + C? Я хотел бы реализовать такой метод в других программах. Как и в этом примере программы:Нарушение бесконечного цикла

#include <iostream> 

int main() 
{ 
    int x = 0; 
    for(;;) 
     cout << x; 
} 

есть способ сохранить цикл for, но сломать его с помощью какого-либо ключа в любое время. Я также должен объяснить, что я понимаю, используя break ;, но я хочу, чтобы цикл продолжал идти. Если я использую условие break, подобное этому, цикл for остановится и дождитесь ответа.

#include <iostream> 

int main() 
{ 
    int x = 0; 
    for(;;) 
    { 
     cout << x; 
     if(getch()=='n') 
       break; 
    } 

} 
+2

перерыв на состоянии. – Rapptz

+1

Используйте 'break' ...? –

+0

* Бесконечные петли * по определению бесконечны. – IInspectable

ответ

1

Найти некоторые условия, которые вы хотите break из цикла, когда встречаются затем использовать ключевое слово перерыва:

#include <iostream> 

int main() 
{ 
    int x = 0; 
    for(;;) 
     cout << x; 
     if(/* break condition*/){ 
      break; 
     } 
} 

Там ничего не мешает вам от реализации условия прерывания при обнаружении конкретного входа клавиатуры от Пользователь.

EDIT: Из вашего отредактированного вопроса вы хотите, чтобы цикл продолжал работать все время и не останавливался, ожидая ввода пользователя. Единственный способ, которым я могу это сделать, - создать новый поток, который прослушивает ввод пользователя, который изменяет переменную, которая обнаруживается в состоянии прерывания вашего основного потока.

Если у вас есть доступ к C++ 11 и новая библиотека потока вы могли бы сделать что-то вроде этого:

#include <iostream> 
#include <thread> 

bool break_condition = false; 

void looper(){ 
    for(;;){ 
     std::cout << "loop running" << std::endl; 
     if(break_condition){ 
      break; 
     } 
    } 
} 

void user_input(){ 
    if(std::cin.get()=='n'){ 
     break_condition = true; 
    } 
} 

int main(){ 
    //create a thread for the loop and one for listening for input 
    std::thread loop_thread(looper); 
    std::thread user_input_thread(user_input); 

    //synchronize threads 
    loop_thread.join(); 
    user_input_thread.join(); 

    std::cout << "loop successfully broken out of" << std::endl; 
    return 0; 
} 

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

+0

Я понимаю этот метод, но он останавливает цикл for, пока он ждет ответа. Я бы хотел, чтобы for-loop продолжался, пока условие прерывания не вышло за его пределы. – JayKay

+1

Что * точно * вы имеете в виду, когда говорите: «Я бы хотел, чтобы for-loop продолжался, пока условие прерывания не вышло за его пределы»? – shuttle87

+0

напишите обработчик сигнала, чтобы установить условие перерыва. – HughB

-1

Вы ищете по-прежнему думаю, что я

#include <iostream> 

int main() 
{ 
    int x = 0; 
    for(;;) 
    { 
     cout << x; 
     if(getch()=='n') 
       continue; 
    } 

} 
+0

Прочитайте [продолжение заявление] (http://en.cppreference.com/w/cpp/language/continue). – IInspectable

+0

ОК, тогда вы должны прочитать вопрос. «Я также должен объяснить, что я понимаю, используя break, но я хочу, чтобы цикл продолжал идти» – healthdev

+0

Вы можете заменить 'contine;' в своем «решении» на ';' без изменения семантики. Ваш предлагаемый 'continue;' ничего не делает * вообще *.Цикл * «продолжается» * как есть. Вероятно, поэтому он называется циклом. – IInspectable

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