805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
1

Объясните, почему программа циклится

09.09.2015, 13:10. Показов 857. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Не пойму, в чем дело, ведь логическое отрицание должно выполняться после попытки ввода, но программа все равно циклится.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <iomanip>
#include <windows.h>
using namespace std;
 
int main(void)
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    for (double temp; !(cin >> temp); cin.clear(), cin.sync())
        cout << "Попробуй снова." << endl;
    system("pause");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.09.2015, 13:10
Ответы с готовыми решениями:

Программа циклится на вводе из файла
Запускаю код, вылезает консоль и зависает. #include &quot;pch.h&quot; #include &lt;iostream&gt; #include...

Пожалуйста объясните! Почему при замене названия функции с main на любое другое программа не компилируется?!
Я начинающий в C++ и мне не очень-то понятна тема функций. Возможно вопрос покажется глупым, но всё...

Объясните почему так
#include &lt;iostream&gt; using namespace std; #define MAT(a,b) a/b; int main() {...

Объясните почему так
Когда я ввожу следующие числа: x = 2222222222 n = 3333333333 И x = 2222222221 (один знак...

12
187 / 172 / 38
Регистрация: 03.08.2012
Сообщений: 596
09.09.2015, 13:19 2
Потому что на выходе получается istream&, который не пустой и не равен нулю, я так понимаю

Добавлено через 4 минуты
Пример:
C++
1
(cin >> temp).gcount(); // В данном случае вы можете получить доступ к методам istream
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
09.09.2015, 13:21  [ТС] 3
Flassie, так ведь cin.clear(), cin.sync() должны его чистить?
0
18838 / 9839 / 2406
Регистрация: 30.01.2014
Сообщений: 17,278
09.09.2015, 13:25 4
Человек вводит строку.
Вводит он, например, фигню. Флаг ошибки устанавливается, затем сбрасывается (clear), буфер синхронизируется(sync). Но данные в буфере никуда не делись. При следующем чтении он опять видит эти данные в буфере, срабатывает флаг ошибки и все повторяется до бесконечности. Для того, чтобы продолжить нормальную работу, нужно игнорировать "плохие символы" в буфере, чтобы при следующем чтении поток мог получить новые данные от пользователя, а не пытаться анализировать старые до бесконечности.
В общем, попробуй так:
C++
1
for (double temp; !(cin >> temp); cin.clear(), cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'))
для numeric_limits подключают <limits>
0
187 / 172 / 38
Регистрация: 03.08.2012
Сообщений: 596
09.09.2015, 13:26 5
Это не важно.
Смотрите, вот еще пример:
C++
1
while(cin == true) cout << "Test" << endl;
Вроде cin пустой, но все равно циклится. Почему? Потому что происходит проверка не на его содержимое, а на него самого
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
09.09.2015, 13:29  [ТС] 6
Цитата Сообщение от Flassie Посмотреть сообщение
Потому что происходит проверка не на его содержимое, а на него самого
Мне всегда казалось, что происходит проверка на флаги ошибок с последующим возвратом булева (или *void) значения.

Добавлено через 1 минуту
DrOffset, хм, спасибо, я до этого момента думал, что cin.sync() как раз и очищает поток
А numeric_limits допускает ситуацию с вводом десятичной точки при вводе числа с пл. точкой?

А это для чего?
Цитата Сообщение от Flassie Посмотреть сообщение
(cin == true)
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
09.09.2015, 13:33 7
спасибо, я до этого момента думал, что cin.sync() как раз и очищает поток
Работа sync зависит от реализации потокового буфера, поэтому где-то будет чиститься, а где-то нет.
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
09.09.2015, 13:35  [ТС] 8
Croessmah,
понятно
0
18838 / 9839 / 2406
Регистрация: 30.01.2014
Сообщений: 17,278
09.09.2015, 13:41 9
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
А numeric_limits допускает ситуацию с вводом десятичной точки при вводе числа с пл. точкой?
Эм, он там вообще не для этого
Он для получения максимальной теоретической длины буфера (std::streamsize - это тип для размерности буфера потока).

Добавлено через 54 секунды
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
ситуацию с вводом десятичной точки
Это тебе надо локали для потока смотреть, чтобы эту ситуацию разрешить так или иначе.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
09.09.2015, 13:43 10
Цитата Сообщение от Flassie Посмотреть сообщение
Вроде cin пустой, но все равно циклится. Почему? Потому что происходит проверка не на его содержимое, а на него самого
Происходит проверка на ошибку (функция потока fail). Используется этот оператор: http://en.cppreference.com/w/c... rator_bool
1
187 / 172 / 38
Регистрация: 03.08.2012
Сообщений: 596
09.09.2015, 13:45 11
Цитата Сообщение от ForEveR Посмотреть сообщение
Происходит проверка на ошибку (функция потока fail). Используется этот оператор: http://en.cppreference.com/w/c... rator_bool
Хм... Интересно. Буду знать. А то я пытался найти оператор, который отвечает за это, но так и не смог, отсюда и такие выводы
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
09.09.2015, 13:49  [ТС] 12
ForEveR, DrOffset, Croessmah, где-то в глубинах форума читал, что проверка условия
C++
1
(cin == true)
неприемлема (или в некоторых реализациях даже запрещена). Объясните в чем дело, кроме бессмысленного лишнего написания кода.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
09.09.2015, 14:14 13
Ferrari F1, Она вообще не приемлима и работать не должна, ибо тут нет контекста в котором возможна неявная конвертация в bool. Так можно:
C++
1
if (cin)
C++
1
while (cin)
и т.п.
0
09.09.2015, 14:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.09.2015, 14:14
Помогаю со студенческими работами здесь

Объясните пожалуйста, почему не запускается?
Найти все четырехзначные числа, у которых сумма крайних цифр равна сумме средних цифр, а само...

Файл: Объясните, почему не работает?
Хочу в созданный пустой файл записать hello. Написал простенькую программу. Объясните, почему не...

Объясните почему вызывается деструктор
Вот код char* ConjunctionLots(ArrayLot firstLot, ArrayLot secondLot, ArrayLot thirdLot) {...

Объясните, почему так нельзя делать?
using namespace std; uint32_t foo(uint32_t c, uint32_t a, const vector&lt; uint32_t&gt; &amp; data) { ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru