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

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

Восстановить пароль Регистрация
 
sauron4er
1 / 1 / 0
Регистрация: 08.01.2013
Сообщений: 12
09.01.2013, 00:14     Что не так с оператором cin? #1
Задание найти сумму первых 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;
}
Спасибо за помощь.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 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
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
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
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.01.2013, 10:50     Что не так с оператором cin? #6
Цитата Сообщение от sauron4er Посмотреть сообщение
Что не так с оператором cin?
Нет такого оператора.
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
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
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.01.2013, 13:56     Что не так с оператором cin? #9
Цитата Сообщение от 0x10 Посмотреть сообщение
А мне сама логика не нравится. Получатся нечто в духе "Давайте будем читать данные до тех пор, пока не произойдет ошибка. А ошибку будем интерпретировать не как ошибку, а как признак конца данных." От этого и идут дальнейшие косяки...
А под виндой и особенно TR-DOSом разве не так принято?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
09.01.2013, 14:45     Что не так с оператором cin? #10
Не знаю как принято. Говорю свое субъективное.
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
09.01.2013, 16:06     Что не так с оператором cin? #11
Цитата Сообщение от 0x10 Посмотреть сообщение

Не по теме:

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

А если на проблему посмотреть с другой стороны - просто ошибка при вводе и заблокированный поток ввода, нужног научиться это исправлять, понятно можно ловить состояние ошибки через try ... catch, но понять как работает поток и как его вернуть к жизни - тоже неплохо.
Schizorb
 Аватар для Schizorb
508 / 460 / 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
Мой лучший друг-отладчик!
 Аватар для 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?
Еще ссылки по теме:

C++ Продемонстрировать различие между вводом с помощью cin.Get и cin.Getline с тремя параметрами
Что делает метод cin.ignore? C++
C++ Объясните пожалуйста как работают cin.good(), cin.sync(), cin.clear()

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

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

Текущее время: 02:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru