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

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

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

Что не так с оператором cin? - C++

09.01.2013, 00:14. Просмотров 685. Ответов 13
Метки нет (Все метки)

Задание найти сумму первых N чисел из введенных ранее.

С помощью оператора cin ввожу числа в вектор, для остановки ввожу символ /, чтоб cin прервался. Можно ввести и любой другой знак, проблема та же.

Но когда надо опять использовать cin, он не хочет работать как надо, будто тот знак / висит в его памяти и сам вводится каждый раз. Ввести N нет возможности. Программа зациклена и начинает бесконечно повторяться будто в оператор cin каждый раз вводится 0.

Что делать?

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
#include <iostream>
#include <vector>
 
 
int main ()
{
    setlocale (0,"Russian");
    std::vector <int> chisla;
    int chislo=0;
    int n=0;
    int summ=0;
 
    std::cout<< "Введите несколько чисел. Для остановки нажмите /.\n";
 
    while (std::cin>>chislo) chisla.push_back(chislo);
    
    std::cout << "Введите количество чисел, которые хотите просуммировать (начиная с первого).\n";
    std::cin>>n;
    if (n<=chisla.size())
    {
        for (int i=0;i<n;i++)
        {
            summ+=chisla[i];
        }
        std::cout << "Сумма первых " << n << " чисел равна: " << summ << ".\n";
        main();
    }
    std::cout << "Вы хотите просуммировать больше чисел, чем ввели. Попробуйте еще раз.\n";
    main();
    
    return 0;
}
Спасибо за помощь.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2013, 00:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что не так с оператором cin? (C++):

Защита от дурака при вводе текста с помощью: cin.get cin.clear cin.sync - C++
Доброго времени суток. На С++ учусь с недавних пор. Имеется стандартная &quot;защита от дурака&quot; на ввод. Не пойму предназначение cin.get() !=...

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

Нюансы работы с оператором ветвления if else: почему программа ведёт себя не так, как ожидается? - C++
Имеется код: int a; char q; for (;;) { cout &lt;&lt; &quot;Введите число: &quot;; cin &gt;&gt; a;

Нюансы работы с оператором ветвления if else: почему программа ведёт себя не так, как ожидается? - C++
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; void check_weekday(string day) { if (day == &quot;Понедельник&quot; || day ==...

Почему при использовании getline( std::cin, str ) строка считывается не так, как ожидается? - C++
Цель программы: При вводе строки, подсчитывает количество гласных букв. Проблема: При вводе количества строк, сразу выдает 0 букв, а...

Что делает cin.get - C++
Вот код: #include &lt;iostream&gt; int main() { int a; std::cin &gt;&gt; a; std::cin.putback ('A'); ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.01.2013, 00:21 #2
cin - это объект, а не оператор.
std::cin>>chislo
тут ожидается, что будет вводится число. если не число, объект становится "плохим", внутри состояние ошибки, за счет этого происходит выход из цикла while. после этого объект не будет нормально работать, пока это состояние ошибки не сбросить.
http://www.cplusplus.com/reference/istream/istream/
посмотрите на функции
clear
good
fail
bad
ну и остальное до кучи.
1
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
09.01.2013, 00:50 #3
C++
1
2
3
4
5
6
7
8
while (std::cin>>chislo)
        chisla.push_back(chislo);
    // чистим буфер
    std::cin.clear();
    while(!isspace(std::cin.get())) continue;
    // или
    //while(std::cin.get()!='\n') continue;
    // чистим буфер
1
sauron4er
1 / 1 / 0
Регистрация: 08.01.2013
Сообщений: 12
09.01.2013, 02:02  [ТС] #4
Спасибо большое!)

Добавлено через 50 минут
Цитата Сообщение от vua72 Посмотреть сообщение
C++
1
2
3
4
5
6
7
while (std::cin>>chislo)
    // чистим буфер
    std::cin.clear();
    while(!isspace(std::cin.get())) continue;
    // или
    //while(std::cin.get()!='\n') continue;
    // чистим буфер
Эти методы я не понял, копипастом они работают, конечно, но смысл пока не понятен) ничего, буду учиться дальше))

А пока нашел еще проще вариант:

C++
1
2
3
std::cin.clear(); // удаляем флаг ошибки.
std::cin.ignore(100, '\n'); // чистим буфер. (удаляет максимум сто символов до перевода строки 
//(в нашем случае лишь один символ надо удалить))
Может кому пригодится.
0
0x10
09.01.2013, 05:44
  #5

Не по теме:

А мне сама логика не нравится. Получатся нечто в духе "Давайте будем читать данные до тех пор, пока не произойдет ошибка. А ошибку будем интерпретировать не как ошибку, а как признак конца данных." От этого и идут дальнейшие косяки...

0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.01.2013, 10:50 #6
Цитата Сообщение от sauron4er Посмотреть сообщение
Что не так с оператором cin?
Нет такого оператора.
0
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
09.01.2013, 12:32 #7
Вы попробуйте поработать с разными типами данных и разными методами ввода (get, getline). Поробуйте ввести массив char большего размера, чем определяете в getline.
C++
1
std::cin.ignore(100, '\n');
не всегда срабатывает

Добавлено через 36 минут
пробуйте
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
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
    char str[10];
    int n;
    cin.getline(str, 10); // здесь вводим больше символовб чем определяем в cin.ignore(100, '\n');
    cin.clear();
    cin.ignore(100, '\n');
    //while(!isspace(std::cin.get())) continue; //здесь читаем пока не встрем 
            /*
             ' '    (0x20)  space (SPC)
            '\t'    (0x09)  horizontal tab (TAB)
            '\n'    (0x0a)  newline (LF)
            '\v'    (0x0b)  vertical tab (VT)
            '\f'    (0x0c)  feed (FF)
            '\r'    (0x0d)  carriage return (CR)
             */
    //while(std::cin.get()!='\n') continue; // а здесь пока не встретим '\n'
    
    cout <<endl<<str;
    cout <<endl;
    cin >>n;
    cout<< n;
    return 0;
}
1
sauron4er
1 / 1 / 0
Регистрация: 08.01.2013
Сообщений: 12
09.01.2013, 13:55  [ТС] #8
Цитата Сообщение от taras atavin Посмотреть сообщение
Нет такого оператора.
Я уже понял, cin - объект, оператор - >>.

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

Не по теме:

А мне сама логика не нравится. Получатся нечто в духе "Давайте будем читать данные до тех пор, пока не произойдет ошибка. А ошибку будем интерпретировать не как ошибку, а как признак конца данных." От этого и идут дальнейшие косяки...

Учусь по книге Страуструпа, фактически только начало, может он опускает некоторые моменты до времени...
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.01.2013, 13:56 #9
Цитата Сообщение от 0x10 Посмотреть сообщение
А мне сама логика не нравится. Получатся нечто в духе "Давайте будем читать данные до тех пор, пока не произойдет ошибка. А ошибку будем интерпретировать не как ошибку, а как признак конца данных." От этого и идут дальнейшие косяки...
А под виндой и особенно TR-DOSом разве не так принято?
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
09.01.2013, 14:45 #10
Не знаю как принято. Говорю свое субъективное.
0
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
09.01.2013, 16:06 #11
Цитата Сообщение от 0x10 Посмотреть сообщение

Не по теме:

А мне сама логика не нравится. Получатся нечто в духе "Давайте будем читать данные до тех пор, пока не произойдет ошибка. А ошибку будем интерпретировать не как ошибку, а как признак конца данных." От этого и идут дальнейшие косяки...

А если на проблему посмотреть с другой стороны - просто ошибка при вводе и заблокированный поток ввода, нужног научиться это исправлять, понятно можно ловить состояние ошибки через try ... catch, но понять как работает поток и как его вернуть к жизни - тоже неплохо.
1
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
09.01.2013, 17:30 #12
Цитата Сообщение от vua72 Посмотреть сообщение
while(std::cin.get()!='\n') continue;
А если я ввел символов меньше, чем указал в getline? Получается лишний раз Enter нажимать?

И еще, можно же использовать cin.sync(), или я ошибаюсь?
0
ZaMaZaN4iK
Мой лучший друг-отладчик!
164 / 164 / 9
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
09.01.2013, 17:43 #13
sauron4er, про ввод и очистку потока есть статья в блоге (от Юры вроде).Очень хорошо написано.Советую
1
sauron4er
1 / 1 / 0
Регистрация: 08.01.2013
Сообщений: 12
11.01.2013, 23:40  [ТС] #14
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
[b]про ввод и очистку потока есть статья в блоге (от Юры вроде).Очень хорошо написано.Советую
спасибо, попробую найти)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2013, 23:40
Привет! Вот еще темы с ответами:

Что делает cin.ignore(); - C++
Поясните мне, какое действие выполняет функция: cin.ignore(); Лучше на примере каком нибудь!(с комментариями) Может быть это что-то...

Что такое CIN и COUT - C++
фоном звучит вопрос printf и scanf - осмелюсь написать что они используют те же механизмы не знаю покажется ли это кому то интересным,...

Метод getline(cin, m) не срабатывает без cin.ignore() / Ревью кода - C++
Почему в моем случае getline(cin, m) не срабатывает без cin.ignore() ? Если по коду есть какие-нибудь замечания, то просьба написать что не...

Продемонстрировать различие между вводом с помощью cin.Get и cin.Getline с тремя параметрами - C++
Нужна помощь. Задача продемонстрировать различие между вводом с помощью cin.get и cin.getline с тремя параметрами, как из потока достать...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.01.2013, 23:40
Ответ Создать тему
Опции темы

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