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

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

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

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

09.01.2013, 00:14. Просмотров 677. Ответов 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;
}
Спасибо за помощь.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2013, 00:14     Что не так с оператором cin?
Посмотрите здесь:

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

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

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

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

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

Что делает метод cin.ignore? - C++
cin.ignore(0,'\n'); Что она делает?

Что будет разделителем для строки cin>>? - C++
Что будет разделителем для строки cin&gt;&gt;? (Напр. для «Один два»).

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.01.2013, 00:21     Что не так с оператором cin? #2
cin - это объект, а не оператор.
std::cin>>chislo
тут ожидается, что будет вводится число. если не число, объект становится "плохим", внутри состояние ошибки, за счет этого происходит выход из цикла while. после этого объект не будет нормально работать, пока это состояние ошибки не сбросить.
http://www.cplusplus.com/reference/istream/istream/
посмотрите на функции
clear
good
fail
bad
ну и остальное до кучи.
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
09.01.2013, 00:50     Что не так с оператором cin? #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;
    // чистим буфер
sauron4er
1 / 1 / 0
Регистрация: 08.01.2013
Сообщений: 12
09.01.2013, 02:02  [ТС]     Что не так с оператором cin? #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'); // чистим буфер. (удаляет максимум сто символов до перевода строки 
//(в нашем случае лишь один символ надо удалить))
Может кому пригодится.
0x10
09.01.2013, 05:44
  #5

Не по теме:

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

taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.01.2013, 10:50     Что не так с оператором cin? #6
Цитата Сообщение от sauron4er Посмотреть сообщение
Что не так с оператором cin?
Нет такого оператора.
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
09.01.2013, 12:32     Что не так с оператором cin? #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;
}
sauron4er
1 / 1 / 0
Регистрация: 08.01.2013
Сообщений: 12
09.01.2013, 13:55  [ТС]     Что не так с оператором cin? #8
Цитата Сообщение от taras atavin Посмотреть сообщение
Нет такого оператора.
Я уже понял, cin - объект, оператор - >>.

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

Не по теме:

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

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

Не по теме:

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

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

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

Нюансы синтаксиса: что значит std::cin в условии цикла while? - C++
do { int v1, v2; cout &lt;&lt; &quot;Please enter two numbers of sum:&quot;; if (cin &gt;&gt; v1, v2) cout &lt;&lt; &quot;Sum is: &quot; &lt;&lt; v1 + v2 &lt;&lt; endl; ...

Как узнать, что есть данные для ввода, которые можно забрать std::cin - C++
Всем здравствуйте! У меня есть параллельный поток, в котором нужно собирать данные с помощью std::cin. Но чтобы произвести эту...

Не работают cin и cout. iostream included, но пишет, что это неизвестные идентификаторы. VC++ 2008 express - C++
Может кто-то подскажет, почему у меня не работают cin и cout? iostream included, но пишет, что эт онеизвестные идентификаторы. Пользуюсь...

Что делает цикл "while(cin.getline(buf,l_buf))" ? - C++
не могу понять,что делает цикл:while(cin.getline(buf,l_buf))-это по сути проверка на ввод строки? cin.getline()-вводит строку ...

А что такое "cin.get();" ? - C++
А что такое &quot;cin.get();&quot; ?


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

Или воспользуйтесь поиском по форуму:
sauron4er
1 / 1 / 0
Регистрация: 08.01.2013
Сообщений: 12
11.01.2013, 23:40  [ТС]     Что не так с оператором cin? #14
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
[b]про ввод и очистку потока есть статья в блоге (от Юры вроде).Очень хорошо написано.Советую
спасибо, попробую найти)
Yandex
Объявления
11.01.2013, 23:40     Что не так с оператором cin?
Ответ Создать тему
Опции темы

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