Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
1 / 1 / 0
Регистрация: 29.02.2016
Сообщений: 43
1

Пролетает cin, после того как goto возвращается в начало программы

29.02.2016, 15:19. Просмотров 1525. Ответов 4
Метки нет (Все метки)


Мне нужно сделать программу, которая будет исключать варианты ввода не целых чисел.
Если вводить целое, то все работает нормально, а если забить например буквы, то программа должно отправить в самое начало (использую goto), после чего надо заново ввести целое число. Но почему-то программа пролетает cin и уходит в рекурсию.

P.S. Я уже лазал по форумам, и пытался использовать cin.sync();, все равно пролетает. (может быть не правильно использовал)

P.S.S. Программу упростил до максимума, что бы Вам было проще разобраться.


Заранее спасибо за помощь!!!

C++
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
29
30
31
32
33
34
35
36
37
#include <iostream>
using namespace std;
 
//___________________________________________________________________
int main ()
{
begin:                  //метка для GOTO
        
    int x;
    x=-8759;
 
//-------------------------------------------------------------------
 
    setlocale(0, ""); 
    cout<<"Введите целое число"<<endl;
 
    cin>>x;             //вот этот cin пролетает
        try
    {
        if (x == -8759) //я понимаю что не совсем корректно сделал условие исключения, потом сделаю по типу (если Вы можете переделать, буду рад)
        {
            throw "Ошибка - деление на 0!!!!"; 
             
        }   
        cout<<endl<<"x="<<x<<endl;
        }
    catch (char *str) 
    {
        cout << str << endl;
        goto begin;
    }
    
 
//-------------------------------------------------------------------   
    system ("pause");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.02.2016, 15:19
Ответы с готовыми решениями:

Для чего в код вводится cin.ignore после того, как cin>> уже сработало?
Доброго времени суток! Просматриваю простой код. Вводится строка типа string: фунты и дюймы Затем...

Пролетает cin >>
Нужно заполнять вектор пока не введено 'x', потом сложить количество (введенное) первых элементов....

Как работает cin.peek, cin,get, cin.ignore, cin.clear?
Здравствуйте, товарищи и не товарищи!:) Я только начал изучать C++, а уже использую вещи, которые...

Закрытие программы только после того, как работу закончат все потоки
У меня есть 30 потоков, обычные threads, их 30 штук. Каждый поток выполняет определенный алгоритм....

4
Объявлятель переменных
1003 / 317 / 292
Регистрация: 24.09.2011
Сообщений: 1,091
29.02.2016, 16:33 2
Если попытаться прочитать целое число через cin, то оператор анализирует ввод до тех пор, пока он напоминает ему число, а всё остальное отбрасывает. Если уже с первого символа вводится что-то постороннее, то в переменную запишется ноль, так что в вашем случае переменная всегда получает значение и исключение не возникает, а следовательно и переход по метке не выполняется.
И тут без goto можно обойтись. Это же дурной тон, говорят.
1
nd2
3406 / 2787 / 1251
Регистрация: 29.01.2016
Сообщений: 9,423
29.02.2016, 19:45 3
Лучший ответ Сообщение было отмечено ggUser как решение

Решение

C++
1
2
3
4
5
6
7
8
// в строке ввода только целое число, перед которым могут быть пробельные символы, + или -.
int a;
while (!(cin >> a) || (cin.peek() != '\n'))
{
    cin.clear();
    while (cin.get() != '\n');
    cout << "Input error! Retry input" << endl;
}
1
1 / 1 / 0
Регистрация: 29.02.2016
Сообщений: 43
01.03.2016, 15:18  [ТС] 4
Большое спасибо за ответ, но появился еще вопрос, объясните пожалуйста как работает - while(cin.get() != '\n');


Спасибо!
0
nd2
3406 / 2787 / 1251
Регистрация: 29.01.2016
Сообщений: 9,423
01.03.2016, 16:05 5
Лучший ответ Сообщение было отмечено ggUser как решение

Решение

Цитата Сообщение от ggUser Посмотреть сообщение
объясните пожалуйста как работает - while(cin.get() != '\n');
При ошибке в потоке, не введённое остаётся в очереди ввода, такая конструкция будет читать по символу(извлекать символы) из потока ввода, пока не прочитает '\n' (последний символ в очереди), таким образом, очередь ввода окажется пустой. Если этого не сделать, то, при следующей итерации цикла, опять будет автоматическая попытка чтения символа, из очереди ввода, на котором произошла ошибка в предыдущей итерации, т.е., цикл замкнётся.
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.03.2016, 16:05

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Какое значение примет переменная f после того, как проработает следующий фрагмент программы?
В программе описаны процедура и переменные следующим образом: Var S, b, d : real; f : boolean;...

Объясните пожалуйста как работают cin.good(), cin.sync(), cin.clear()
Такая проблема: сдаю в вуза лабораторные по программированию, писал все сам, до этого c++ не...

Почему программа по ret возвращается в начало?
Есть код, просто проверяющий семисегментник. Спойлерinclude...

Как избавиться от goto без вреда для программы?
Как избавиться от goto, сохранив при этом функционал программы? Чтобы программа работала точно так...


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

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

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