Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 338
#1

Цикл не прерывается при вводе Enter - C++

27.05.2014, 10:16. Просмотров 1241. Ответов 34
Метки нет (Все метки)

Хотелось бы узнать почему цикл while не прерывается при введение enter. Переписал код всеми доступными мне способами. вроде бы нет ошибок но не работает.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <conio.h>
#include <vector>
int main()
{
    setlocale( LC_ALL, "Russian");
    std::vector<int> num;
    int a;
    char s = '\n';
std::cout << "Введите несколько чисел: \n";
while(std::cin >> a && a != s)
a % 2 != 0 ? num.push_back(a): num.push_back(a*2);
for(int r = 0; r < num.size(); r++)
    std::cout << r << " Элемент вектора: " << num[r] << std::endl;
_getch();
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2014, 10:16     Цикл не прерывается при вводе Enter
Посмотрите здесь:
Как остановить цикл при вводе enter? C++
Почему при вводе числа программа работает нормально, а при вводе буквы уходит в бесконечный цикл? C++
C++ Ошибка с массивом: программа при вводе "ступорится" при нажатии клавиши Enter
Как сделать, чтобы при вводе в консоли <Enter> не переводил курсор на начало следующей строки? C++
Завершить игровой цикл при вводе нуля C++
C++ Бесконечный цикл при вводе несоответствующего типа данных
Завершить цикл при вводе значения первой переменной C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,183
Завершенные тесты: 1
27.05.2014, 11:08     Цикл не прерывается при вводе Enter #2
Вводить надо не enter а ctrl+Z
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 338
27.05.2014, 11:25  [ТС]     Цикл не прерывается при вводе Enter #3
Цитата Сообщение от zss Посмотреть сообщение
Вводить надо не enter а ctrl+Z
Не понял. Причем тут контрол +з?
Ввожу несколько чисел жму энтер не чего не произходит. Ввожу любой другой символ потом ентер программа работает
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,183
Завершенные тесты: 1
27.05.2014, 12:08     Цикл не прерывается при вводе Enter #4
ctrl+Z - это признак конца файла.
Изображения
 
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 338
27.05.2014, 13:35  [ТС]     Цикл не прерывается при вводе Enter #5
Народ помогите мне. Прошу. В чем моя ошибка? Не чего не могу придумать. Цикл while должен остановится если условия цикла не верны. При вводе enter переменная "а" получает значение '\n'. Что делает условия цикла не верным.
C++
1
2
char s = '\n';
while(std::cin >> a && a != s)
Цикл должен прекратится при получение a = '\n';

Пробовал следующие варианты чтоб остановит цикл при нажатие энтер.
C++
1
2
3
4
5
6
7
char s = '\n';
while(std::cin >>a)
{
if( a == s)
break;
else
....}
Не работает. Цикл должен прекратится если условия оператора if верны (а == s)

C++
1
2
3
4
5
std::cin >> a;
    do  
        a % 2 != 0 ? num.push_back(a*2): num.push_back(a);
        while( a == s)
            break;
Выдает ошибку типа перед break; должен быт ";" Не знаю в чем проблема. Но цикл должен прекратится.

C++
1
2
3
4
std::cin >> a;
    while( a != s)
        {
    a % 2 != 0 ? num.push_back(a*2): num.push_back(a);}
Не работает. Цикл должен проверит условие a != s и продолжит своею работу если резулmтат условия true.

Добавлено через 4 минуты
zss, условия цикла требует чтоб цикл остановился при получение символа новой строки. Потом причем тут контрол +з? Цикль завершаеться при получение любого символа который отличается от int. Но надо чтоб программа работала правильно. Это похоже на остановку машины без тормозов.

Добавлено через 14 минут
Тема актуальна. Мне все еще нужна помощь. Уже 2 дня проверяю этот код.

Добавлено через 34 минуты
Тема актуальна. Мне все еще нужна помощь.
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,183
Завершенные тесты: 1
27.05.2014, 14:04     Цикл не прерывается при вводе Enter #6
Цитата Сообщение от Altair42 Посмотреть сообщение
while(std::cin >>a)
Поскольку a имеет тип int, то при вводе все пробельные символы пропускаются
(в т.ч. и '\n'). А чем Вас не устраивает ctrl+Z ? Это общеизвестный способ завершения консольного ввода.
В посте №4 я продемонстрировал, что на Вашей программе он прекрасно срабатывает.
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 338
27.05.2014, 14:33  [ТС]     Цикл не прерывается при вводе Enter #7
zss, я знаю что он работает. Так же как и ввод любого символа. Но это не этично ввести ошибочный символ чтоб завершит цикл. Может быт для вас это в порядке вещей. Но представте что вы пишете программу для кого та. Пользователь нажимает энтер но не чего не произходит. Пользователь не должен знать что если ввести ошибочный символ программа заработает. Язык С++ предоставляет возможности завершит цикл. Вам бы понравилось если бы на вашей машине не работали тормоза и каждый раз чтоб тормозит вам пришлось бы врезаться об стену?
Да все пробельные символы пропускаются но сим вол новой строки инициализирован. Я так делал в других программах все работало норм.
Если символ новый строки пропускаеться как и пробел то почему работает этот код?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main()
{
    setlocale (LC_ALL, "Russian");
    vector<int> num;
    std::cout << " Введите несколько чисел : "  <<std::endl;
    int a;
    char s='\n';
    while (std::cin >> a && a != s)
     {   num.push_back(a);
    
    
    int *ar = new int [num.size()];
     for(vector<int>::iterator iter = num.begin(); iter != num.end(); iter++)
     {for(int *q = ar; q != ar + num.size(); q++)
     *ar = *iter;
     std::cout << "Символ массива " << *ar + 1 << std::endl;}
     delete [] ar;
    }
        _getch();
            return 0;
    }
Разница в цикле while только в том что в коде котором я показал на первом посте за 1 шаг цикла делаеться несколько операциий. А на этом коде только 1.

Добавлено через 8 минут
И еще. Если дат условие чтоб цикл завершился при получение символа пробела то он должен завершится. Не имеет значение какой символ если в условие написано что надо завершит цикл при получение хз какого та там символа то цикл должен завершится.

Добавлено через 1 минуту
Прошу прошение в этом коде несколько операций. Забыл про фигурные скобки
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,183
Завершенные тесты: 1
27.05.2014, 15:45     Цикл не прерывается при вводе Enter #8
ctrl+Z это не ошибочный символ. это признак конца ввода.
Но если Вас не устраивает, то читайте в текстовую строку,
а потом переводите в целое число:
C++
1
2
3
char buf[100];
cin.getline(buf,100);
int a=atoi(buf);
Цитата Сообщение от Altair42 Посмотреть сообщение
while (std::cin >> a && a != s) { num.push_back(a);}
Есть один выход из этого цикла- ввод числа 10, тогда 10=='\n' истина.
Но как оператор до такого догадается? А то, что ctrl+Z - конец ввода почти все знают
(наверное кроме Вас).
Croessmah
Модератор
Эксперт CЭксперт С++
13052 / 7315 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
27.05.2014, 16:19     Цикл не прерывается при вводе Enter #9
C++
1
int a ;
При вводе чисел разделители игнорируются(пробелы, табуляция, переводы строк), так что
C++
1
std::cin >> a && a!= s;
будет истинно пока не будет введено число, равное коду '\n'(char s = '\n'), или пока не произойдет ошибка чтения числа(например, наткнется на букву)
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 338
27.05.2014, 16:44  [ТС]     Цикл не прерывается при вводе Enter #10
Croessmah я это понял н огда почему следующая программа работает?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main()
{
    setlocale (LC_ALL, "Russian");
    vector<int> num;
    std::cout << " Введите несколько чисел : "  <<std::endl;
    int a;
    char s='\n';
    while (std::cin >> a && a != s)
     {   num.push_back(a);
    
    
    int *ar = new int [num.size()];
     for(vector<int>::iterator iter = num.begin(); iter != num.end(); iter++)
     {for(int *q = ar; q != ar + num.size(); q++)
     *ar = *iter;
     std::cout << "Символ массива " << *ar + 1 << std::endl;}
     delete [] ar;
    }
        _getch();
            return 0;
    }
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,183
Завершенные тесты: 1
27.05.2014, 16:49     Цикл не прерывается при вводе Enter #11
Цитата Сообщение от Altair42 Посмотреть сообщение
почему следующая программа работает?
Еще раз повторяю - она точно так же работает как и предыдущая.
Цикл while заканчивается в 2 случаях
1. При вводе числа 10
2. При вводе ctrl+Z.
Croessmah
Модератор
Эксперт CЭксперт С++
13052 / 7315 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
27.05.2014, 16:50     Цикл не прерывается при вводе Enter #12
Цитата Сообщение от Altair42 Посмотреть сообщение
Croessmah я это понял н огда почему следующая программа работает?
Распишем по пунктам:
1. Считываем число в a
2. Добавляем число в вектор
3. Выделяем память под int'ы
4. Не понятные циклы с выводом
5. Освобождение памяти
6. Переходим к пункту один.

Получаем такое же поведение.
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 338
27.05.2014, 17:02  [ТС]     Цикл не прерывается при вводе Enter #13
zss, в второй программе выход из цикла по нажатию энтер , при вводе 10 и при вводе любого символа.

Цикл не прерывается при вводе Enter
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,183
Завершенные тесты: 1
27.05.2014, 17:05     Цикл не прерывается при вводе Enter #14
Это не выход из цикла, а ожидание следующей порции ввода.
Посмотрите в отладчике.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.05.2014, 17:05     Цикл не прерывается при вводе Enter
Еще ссылки по теме:
C++ Цикл for на 5 итераций прерывается после 1-ой, 2-ой или 3-ей
После первого scanf выводятся сразу все оставшиеся printf и цикл прерывается C++
c++ завершить цикл клавишей <Enter> C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Altair42
0 / 0 / 0
Регистрация: 28.06.2013
Сообщений: 338
27.05.2014, 17:05  [ТС]     Цикл не прерывается при вводе Enter #15
zss, я не говорил что вы не правы и т.п. Я вижу что 1 программа так работает а другой нет.

Цитата Сообщение от Croessmah Посмотреть сообщение
Получаем такое же поведение.
Не совсем такое. Эта программа при нажатие энтер выходит из цикла.
Yandex
Объявления
27.05.2014, 17:05     Цикл не прерывается при вводе Enter
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru