#c #iostream
#c #iostream
Вопрос:
Я должен принять переменное количество двойных значений, а затем символ, чтобы завершить ввод двойных значений (считываемых в список InData). После этого я должен ввести 2 целых числа в i и m.
Проблема в том, что cin переполнен.
я должен принять следующий ввод в программу
0.594
0.928
0.515
0.055
0.507
0.351
0.262
0.797
0.788
0.442
0.097
0.798
0.227
0.127
0.474
0.825
0.007
0.182
0.929
0.852
e
2 5
Для этого мой код выглядит так:
#include <iostream>
#include <list>
#include <cstdio>
using namespace std;
int main (void)
{ list <double> inData;
double temp;
int i, m, M, N;
char a;
while (cin >> temp)
{ inData.push_back(temp);
}
N = inData.size();
//fflush(cin);
//cin >> a;
cin.ignore(1);
cin >> i >> m;
cout << (int )a << " " << N << " " << i << " ABC " << m << endl;
return 0;
}
Что в этом плохого .. пожалуйста, посмотрите, почему он не принимает значения i и m. i и m дают значения мусора в строке cout…
Вывод будет
-65 20 233304 ABC 213344
где 1-е, 3-е и 5-е значения являются мусором.
Ответ №1:
Попробуйте это:
cin.clear();
cin >> a;
Комментарии:
1. @Saurajeet — Пожалуйста, проголосуйте за все ответы, которые вы сочли полезными (щелкните изображение со стрелкой вверх) и примите ответ, который вы сочли наиболее полезным (щелкните изображение с галочкой).
Ответ №2:
Когда cin >> temp
, наконец, произойдет сбой (из-за обнаружения маркера «e»), failbit
будет установлен on cin
, что предотвращает чтение дополнительных данных из потока до тех пор, пока он не будет clear
отредактирован.
while (cin >> temp) { inData.push_back(temp); }
N = inData.size();
cin.clear(); // <---
cin >> a >> i >> m; // no need to 'ignore' or flush anything
Ответ №3:
Я думаю, что вы хотите:
do{
cin >> temp;
if (cin.good())
inData.push_back(temp);
} while (cin.good());
cin.clear();
вместо цикла while.
a
Переменная больше не считывается из cin
, поэтому, скорее всего, будет мусором.
Комментарии:
1. может быть упрощен до просто
while (cin >> temp) inData.push_back(temp); cin.clear();
2. Ах! Теперь я вижу. Я не знал о
operator void*
inistream
и продолжал задаваться вопросом, почему это вообще работает.
Ответ №4:
Когда дело доходит до строки
N = inData.size();
cin находится в недопустимом состоянии.Любые операции с cin завершатся неудачей. вы должны сбросить его значения и использовать его.