Как выйти из while c
Перейти к содержимому

Как выйти из while c

  • автор:

Выход из цикла while

Просто не надо создавать два глухих цикла (и интересно — почему снаружи while , а внутри for ?), если всё-таки из них предполагается когда-то выйти. И переменные для проверки условия продолжения цикла — самый нормальный способ.

9 июн 2015 в 16:35
Старый эпический топик (больше 1000 постов) на эту тему — rsdn.ru/forum/philosophy/57977.flat.1
9 июн 2015 в 19:11

5 ответов 5

Сортировка: Сброс на вариант по умолчанию

К сожалению, в отличие от Джавы, C и C++ не поддерживают механизм вроде break label , поэтому самый чистый вариант — использовать goto:

int main() < while (true) < for (;;) < goto breakAll; >> breakAll: puts("I'm out!"); > 

Также можно использовать флаг:

int main() < bool running = true; // bool определен в stdbool.h while (running) < for (;;) < running = false; break; >> puts("I'm out!"); > 

Большой разницы между этими вариантами нет.

Помимо этого случая, goto также используется в хорошем стиле C для обработки ошибок:

bars_t foo() < bar_t *bar1 = malloc(sizeof(*bar1)); if (!bar1) < goto cleanupNothing; >bar_t *bar2 = malloc(sizeof(*bar2)); if (!bar2) < goto cleanupBar1; >// . return (bars_t) < .one = bar1, .two = bar2 >; // в обратном порядке определения cleanupBar2: free(bar2); cleanupBar1: free(bar1); cleanupNothing: return (bars_t); > 

В C++ подобное не нужно, т.к. есть RAII, но из циклов по-прежнему выходят через goto .

Отслеживать
ответ дан 9 июн 2015 в 16:11
Alexei Averchenko Alexei Averchenko
1,049 6 6 серебряных знаков 11 11 бронзовых знаков
А тут, кстати, много меток и не надо, ибо free() лопает и NULL 🙂
9 июн 2015 в 16:21

Ещё добавлю пару способов.

Указанный код выносится в отдельную функцию. И теперь можно выходить по обычному return .

Способ два — нужно прост создать переменную флаг. И проверять ее. Где то так

bool go = true; while(go) < for(;;) < if (. ) < go = false; break;>> 

Но это плохой способ.

Отслеживать
ответ дан 9 июн 2015 в 16:19
112k 6 6 золотых знаков 93 93 серебряных знака 159 159 бронзовых знаков
Самый нормальный способ.
9 июн 2015 в 16:35
более того, он выходит с циклов любой вложенности:)
9 июн 2015 в 16:36

try < while (true) < for (;;) < throw 1; >> > catch (int) < //вышли из двух вечных циклов одновременно >

Отслеживать
32k 19 19 золотых знаков 79 79 серебряных знаков 105 105 бронзовых знаков
ответ дан 9 июн 2015 в 16:13
175 6 6 бронзовых знаков
Какая-то эзотерика
9 июн 2015 в 16:16
Исключения следует использовать для исключительных ситуаций.
9 июн 2015 в 18:00

«Исключения следует использовать для исключительных ситуаций» — а разве выход сразу из двух вечных циклов это не исключительная ситуация?

9 июн 2015 в 18:02

@outcast: Нет. Это вполне обычная ситуация. Исключительная не значит «мне ни разу не попадалась», значит «в программе должна возникать в виде исключения, а не правила».

9 июн 2015 в 20:01

Выход из 2-х! бесконечных циклов это правило? Вот это да, никогда бы не подумал 🙂 Как не трудно заметить все альтернативные варианты либо предполагают изменение циклов, что очевидно противоречит изначальному условию (один из них перестает быть бесконечным), либо выглядят крайне сомнительно (вариант с goto). За исключением варианта с вынесением внутреннего цикла в отдельную функцию и пары return false/break, но это усложнит программу добавив в нее еще 1 сущность.

Как выйти из цикла while();

do while — как выйти из цикла?
Подскажите пожалуйста, а то я уже всю голову "сломал", почему при вводе "А" цикл не прерывается.

Как выйти из цикла? Не получается
Есть задача: Из-за высокой цены бензина водители озабочены затратами топлива своих.

Как выйти из цикла с символьными массивами?
Допустим, хочу сделать цикл, в котором бы считывалась символьная строка с клавиатуры и выводилась.

3434 / 2813 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426

ЦитатаСообщение от Shuller Посмотреть сообщение

выйти из цикла while();
Введи (для windows), в отдельной строке, Ctrl + Z .
Регистрация: 08.01.2017
Сообщений: 4

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
#include #include #include #include #include using namespace std; void reverse_my(vectorstring> vec); int main() { vector string> words; string str; cout  <"Enter you speach: "; while (getline(cin, str, ' ')) { words.push_back(str); } words.push_back(str); reverse_my(words); } void reverse_my(vectorstring> vec) { unsigned int s = vec.size(); for (unsigned int i = 0; i  s / 2; i++) { string str = vec[i]; vec[i] = vec[s - i - 1]; vec[s - i - 1] = str; } for (unsigned int i = 0; i  vec.size(); i++) { cout  [i]  <" "; } }

Что-то в голову мысли не приходят, а как сделать так чтобы при нажатии на ‘.’ у предложения первого менялись местами слова. А второй вектор создавался со вторым предложением?

Как выйти из цикла?

Здрасьте!Я новичок, и у меня достаточно глупый вопрос. Как тут реализовать выход из цикла?

1 2 3 4 5 6 7 8 9 10 11 12 13
#include #include int main() { char select=""; system("chcp 1251"); system("cls"); while (select != "Y") { printf("Хотите закончить? (Y/N)\n"); scanf("%s", &select); } return 0; }

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Как выйти из цикла при нажатии клавиши ESC
Доброго времени дня. Поясните, как выйти из цикла при нажатии клавиши ESC void GetStr()

Выйти из цикла Do while через Enter
Как выйти из цикла Do while через Enter #include <stdio.h> #include <stdlib.h>.

do while — как выйти из цикла?
Подскажите пожалуйста, а то я уже всю голову "сломал", почему при вводе "А" цикл не прерывается.

591 / 395 / 208
Регистрация: 30.04.2017
Сообщений: 730

Лучший ответ

Сообщение было отмечено Adrian_One как решение

Решение

для строк нельзя применять обычное сравнение, применяйте strcmp()
под select предварительно нужно выделять память через malloc, чтобы туда можно было уместить строку.
И select должен быть указателем.

Добавлено через 10 минут

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#include #include int main() { char* select = malloc(20*sizeof(char)); system("chcp 1251"); system("cls"); int check_str=1; while (check_str) { printf("Хотите закончить? (Y/N)\n"); scanf("%19s", select); if(strcmp(select,"Y")==0) check_str=0; } return 0; }

Добавлено через 9 минут
Вообще можно сделать без строк вот так

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include #include int main() { char select = 'n'; system("chcp 1251"); system("cls"); while (select!='y') { printf("Хотите закончить? (Y/N)\n"); scanf("%с", &select); fflush(stdin); } return 0; }

Регистрация: 07.12.2011
Сообщений: 80

У тебя написано правильно и должно работать без проблем. Что не нравиться то?
Единственное это: так как у тебя переменная select имеет тип char, то в конструкции scanf(«%s», &select); нужно использовать спецификатор формата %c. В остальном всё отлично.
Если бы ты собирался принимать в качестве параметра в scanf строку с параметрами или к примеру нужно было искать в этой строке определённый символ или несколько символов и при их нахождении выходить из цикла, то тогда имело бы смысл использовать часть примера приведённого Ovederax, и то только небольшую его часть_)))

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Как выйти из цикла
Помогите пож дописать макрос! Нужно найти номер позиции первой буквы кириллицы в строке как.

Как выйти из цикла while();
#include <iostream> #include <fstream> #include <cctype> #include <string> #include <vector>.

Как выйти из цикла foreach
Как досрочно выйти из цикла foreach?

Как выйти из цикла? Не получается
Есть задача: Из-за высокой цены бензина водители озабочены затратами топлива своих.

BREAK

Оператор break имеет два назначения. Первое — это окончание работы оператора switch. Второе — это принудительное окончание цикла, минуя стандартную проверку условия. Данное назначение здесь и рассматривается. Когда оператор break встречается в теле цикла, цикл немедленно заканчивается и выполнение программы переходит на строку, следующую за циклом. Например:

Данная программа выводит числа от 0 до 10 включительно и заканчивает работу, поскольку break вызывает немедленный выход из цикла, минуя условие t< 100.

Оператор break, как правило, используется в циклах, где особые условия могут вызвать немедленное завершение работы. Ниже приведен пример того, как нажатие на клавишу может остановить выполнение функции look_up():

int look_up(char *name)
char tname[40];
int loc;
loc = -1;
do
loc = read_next_name(tname);
if(kbhit ()) break;
>
while(!strcmp(tname, name));
return loc;
>

Можно использовать функции такого типа для поиска имени в файле базы данных. Если файл слишком длинный и надоело ждать, то можно нажать на клавишу и выйти из функции до окончания работы. Функция kbhit() возвращает 0, если не было нажатия. В противоположном случае она возвращает ненулевое значение, break вызывает выход из самого внутреннего цикла. Например:

выводит числа от 1 до 10 включительно 100 раз. Каждый раз, когда встречается break, контроль передается внешнему циклу for.

break, используемый в операторе switch, влияет только на данный switch, но не на цикл, в котором может находиться switch.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *