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

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

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

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

09.01.2013, 00:14. Просмотров 656. Ответов 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;
}
Спасибо за помощь.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1480 / 1056 / 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
2456 / 1628 / 238
Регистрация: 24.11.2012
Сообщений: 4,003
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
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
Мой лучший друг-отладчик!
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.ignore();
C++ Почему при использовании getline( std::cin, str ) строка считывается не так, как ожидается?
Нюансы работы с оператором ветвления if else: почему программа ведёт себя не так, как ожидается? C++
Нюансы работы с оператором ветвления if else: почему программа ведёт себя не так, как ожидается? C++
C++ Метод getline(cin, m) не срабатывает без cin.ignore() / Ревью кода

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

Или воспользуйтесь поиском по форуму:
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