2015-08-06 2 views
2

Я использую cin >> x[0] >> x[1] >> x[2] >> x[3]; и т.д., чтобы получить ввод, например:Как я могу взять несколько ints в одной строке с C++, не зная, сколько будет введено?

1 2 3 4.

Но моя проблема в том, что там может быть от 3-х разных чисел (1, 2 и 3, например,) до 20 разных номеров, и я не знаю, сколько заранее. Поскольку пользователь может ввести до 20 цифр, я повторил шаблон выше, пока не будет [19]. Я обнаружил, что программа не будет продолжаться до тех пор, пока она не будет иметь вход для каждого из этих значений.

+2

Наивное решение: попросите ввести цифры, а затем выполните цикл. В противном случае интерпретируйте какое-либо специальное значение (числовое или нет) в качестве терминатора. –

+0

Вы можете попробовать прочитать строку из ввода и проанализировать ее. Разбить входную строку на символ пробела и преобразовать каждую подстроку в int. – aisbaa

ответ

1

Просто укажите пользователю: - , чтобы остановить ввод чисел, нажмите «Q» и поместите в него код для проверки. Когда пользователь вводит Q, продолжайте использовать свой код.

Или вы можете попросить пользователя ввести количество цифр, которое он будет вставлять.

5

Используйте std::getline, чтобы прочитать целую строку, затем создайте std::istringstream и прочитайте цикл int в цикле while. Если синтаксический анализ не выполняется, будет установлен std :: ios_base :: failbit, который должен быть проверен в состоянии while (путем неявного литья istringstream для bool). Когда все входные данные успешно разбираются, std :: ios_base :: eofbit будет установлен после выхода из цикла.

Что-то вроде этого:

std::string line; 
std::getline(std::cin, line); 

std::istringstream input(line); 
std::vector<int> result; 
int value; 
while (input >> value) 
{ 
    result.push_back(value); 
} 
const bool success = input.eof(); 
+2

И пользователь злонамерен и входит в «Привет»? Затем вы получите UB, поскольку значение не инициализировано, и вы не проверяете наличие сбоя. Короче говоря, не просто проверяйте eof, лучше используйте while (input >> value) {...}, чтобы проверить действительную операцию ввода –

+0

См. Также [здесь] (http://stackoverflow.com/q/5431941/ 509868) о 'feof', который имеет ту же проблему (прост в использовании неправильно, лучше вообще не использовать) – anatolyg

+0

См. [Здесь] (http://stackoverflow.com/q/3421817/509868), как это сделать правильно – anatolyg

1

CIN возвращает истину, если переменная считывается, так что вы можете использовать

while (cin>>x[ind++]) 

the question on while (cin >>) проверить, что для получения дополнительной информации.