Как заполнить одномерный массив единовременно, то есть не по одному элементу (первое число - Enter - второе число - Enter - ...), а например (1 2 3 4 5 6 7 8 Enter), как обработать подобный ввод?
Asked
Active
Viewed 4,925 times
4 Answers
3
Получил в ходе экспериментов:
int a[5];
for (int i = 0; i < 5; i++)
cin >> a[i];
Спасибо!
aryndin
- 1,294
1
Оба случая одинаково
#include <err.h>
#include <sysexits.h>
...
int array[N];
for (int i = 0; i < N; i++)
if (scanf("%d", array + i) != 1)
errx(EX_DATAERR, "Bad input");
avp
- 46,098
- 6
- 48
- 116
1
#include <iostream>
using namespace std;
int main(){
int arr[3];
cin >> arr[0] >> arr[1] >> arr[2]; // обеспечивает ввод трех чисел разделенных пробелами и подтверждение клавишей enter
cout << "a: " << arr[0] << " b: " << arr[1] << " c: " << arr[2] << endl;
return 0;
}
perfect
- 10,021
-
1этот код отлично введет, даже если на вход подать так
5<enter><enter>10<enter><enter>5. Задача куда интереснее, если нужно, чтобы enter был как раз "окончанием ввода. – KoVadim Dec 21 '14 at 17:19 -
@KoVadim такой подход также отлично ведет себя со смешанными данными. А я вообще пришел к выводу, что надо избавлять себя от сишных конструкций, чтоб код логичней ставал и проще к чтению. – perfect Dec 21 '14 at 17:24
-
@KoVadim а насчет вашего интереса то он скорей закончитца на этом http://www.cplusplus.com/reference/istream/istream/getline/ – perfect Dec 21 '14 at 17:36
-
я знаю о getline. Но тогда нужна ещё одна функция, типа "split". А ТС хочет "в одну строку". – KoVadim Dec 21 '14 at 18:04
-
ну можно прочитать getline'om как string и потом sstream'ом распарсить. не? – b2soft Dec 22 '14 at 18:32
1
Чтобы прочитать неизвестное заранее количество разделённых пробелами целых чисел, можно использовать vector и istream_iterator<int>:
std::istream_iterator<int> numbers(std::cin), eof;
std::vector<int> a(numbers, eof);
Полный пример:
#include <algorithm> // copy
#include <iostream>
#include <iterator>
#include <vector>
int main()
{
std::istream_iterator<int> numbers(std::cin), eof;
std::vector<int> a(numbers, eof);
std::copy(a.begin(), a.end(), std::ostream_iterator<int>(std::cout, "\n"));
}
std::copy() используется, чтобы напечатать каждое число из вектора на новой строке.
Пример использования:
$ g++ read-vector.cc -o read-vector && echo 1 2 3 4 5 6 7 8 | ./read-vector
Вывод:
1
2
3
4
5
6
7
8
jfs
- 52,361
Вы про потоки ввода-вывода почитайте что-нибудь и поэкспериментируйте немного.
– avp Dec 21 '14 at 15:42