Я бы рекомендовал читать строку в строку, а затем разбивать ее на основе пробелов. Для этого вы можете использовать функцию getline(...). Хитрость заключается в наличии структуры данных динамического размера для хранения строк после их разделения. Вероятно, проще всего использовать vector.
#include <string>
#include <vector>
...
string rawInput;
vector<String> numbers;
while( getline( cin, rawInput, ' ' ) )
{
numbers.push_back(rawInput);
}
Итак, скажем, ввод выглядит так:
Enter a number, or numbers separated by a space, between 1 and 1000.
10 5 20 1 200 7
Теперь у вас будет вектор чисел, который содержит элементы: {"10","5","20","1","200","7"}.
Обратите внимание, что это все еще строки, поэтому они бесполезны в арифметике. Чтобы преобразовать их в целые числа, мы используем комбинацию функции STL, atoi(...), и поскольку atoi требует c-строки вместо строки в стиле C++, мы используем string class' c_str() функция-член.
while(!numbers.empty())
{
string temp = numbers.pop_back();//removes the last element from the string
num = atoi( temp.c_str() ); //re-used your 'num' variable from your code
...//do stuff
}
Теперь есть некоторые проблемы с этим кодом. Да, он работает, но немного неуклюже и выводит числа в обратном порядке. Давайте перепишем его так, чтобы он был немного более компактным:
#include <string>
...
string rawInput;
cout << "Enter a number, or numbers separated by a space, between 1 and 1000." << endl;
while( getline( cin, rawInput, ' ') )
{
num = atoi( rawInput.c_str() );
...//do your stuff
}
Есть еще много возможностей для улучшения обработки ошибок (прямо сейчас, если вы введете не число, программа рухнет), и есть бесконечно больше способов действительно обработать ввод, чтобы получить его в пригодной для использования числовой форме (радости программирования! ), но это должно дать вам всестороннее начало. :)
Примечание. У меня были справочные страницы в виде ссылок, но я не могу опубликовать более двух, так как у меня менее 15 сообщений :/
Редактировать: я немного ошибся в поведении atoi; Я перепутал это с преобразованием Java в string->Integer, которое выдает исключение Not-A-Number, когда задана строка, не являющаяся числом, а затем приводит к сбою программы, если исключение не обрабатывается. atoi(), с другой стороны, возвращает 0, что не так полезно, потому что что, если 0 — это число, которое они ввели? Воспользуемся функцией isdigit(...). Здесь важно отметить, что доступ к строкам стиля C++ можно получить как к массиву, то есть rawInput[0] является первым символом в строке вплоть до rawInput[length - 1].
#include <string>
#include <ctype.h>
...
string rawInput;
cout << "Enter a number, or numbers separated by a space, between 1 and 1000." << endl;
while( getline( cin, rawInput, ' ') )
{
bool isNum = true;
for(int i = 0; i < rawInput.length() && isNum; ++i)
{
isNum = isdigit( rawInput[i]);
}
if(isNum)
{
num = atoi( rawInput.c_str() );
...//do your stuff
}
else
cout << rawInput << " is not a number!" << endl;
}
Логическое значение (true/false или 1/0 соответственно) используется в качестве флага для цикла for, который проходит через каждый символ в строке и проверяет, является ли он цифрой 0-9. Если какой-либо символ в строке не является цифрой, цикл прервется во время его следующего выполнения, когда он дойдет до условия «&& isNum» (при условии, что вы уже прошли циклы). Затем, после цикла, isNum используется для определения того, следует ли выполнять ваши действия или распечатать сообщение об ошибке.
person
Logan Nichols
schedule
27.10.2012