#c #vector #cin
#c #вектор #cin
Вопрос:
Следующий код выполняется и сохраняет входные данные в векторе, как и должно быть, но бесконечно повторяет цикл, прослушивая входные данные. Цель состоит в том, чтобы взять строку ints
из одной строки ввода, разделенную пробелами, и сохранить их в векторе.
int main(int argc, char ** argv){
int input;
vector<int> intVector;
while (cin >> input)
intVector.push_back(input);
//print vector contents
copy(intVector.begin(), intVector.end(), ostream_iterator<char>(cout, " ")); cout << "n";
return 0;
}
Я хочу каким-то образом добавить простое дополнительное условие в цикл while, которое проверяет конец строки, чтобы он не продолжал прослушивание бесконечно. cin.oef
здесь бесполезно. Я уже пробовал это и несколько других вещей.
Есть ли что-нибудь чистое, короткое и элегантное, что я могу добавить, чтобы исправить это?
Комментарии:
1. Как насчет использования
getline
вместо>>
?2. как бы это выглядело конкретно?
3. Вы пробовали en.cppreference.com/w/cpp/iterator/istream_iterator и en.cppreference.com/w/cpp/iterator/back_inserter ?
Ответ №1:
Как насчет
vector<int> intVector( std::istream_iterator<int>( std::cin ),
std::istream_iterator<int>() );
Комментарии:
1. отличная идея! Не забудьте включить
<iterator>
заголовок.
Ответ №2:
Вы можете использовать sstream
библиотеку:
#include <vector>
#include <string>
#include <sstream>
#include <iostream>
#include <iterator>
using namespace std;
int main(int argc, char ** argv) {
string buf;
while(getline(cin, buf)) {
istringstream ssin(buf);
vector<int> intVector;
int input;
while(ssin >> input) {
intVector.push_back(input);
}
//print vector contents
cout << intVector.size() << endl;
copy(intVector.begin(), intVector.end(), ostream_iterator<int>(cout, " "));
cout << "n";
}
return 0;
}
Комментарии:
1. Соответствует ли это спецификациям? Что происходит с вводом
1 2n3 4n
. Похоже, что вместо первой строки будут обработаны обе строки.
Ответ №3:
Если вы хотите избежать ошибок, таких как вставка символа в целочисленную переменную, вы могли бы сделать:
while (some condition) {
if (!(std::cin >> int_variable)) {
std::cin.clear();
std::cin.ignore(1024, 'n');
} else {
array.push_back(int_variable);
// Anything else or increment the condition variable
}
}