Как соединить два массива в С++

166
15 ноября 2021, 10:10

Вот такой код. При выполнении ввожу: 5, (1,2,3,4,5), 5 (6,7,8,9,10), получаю -858993460 -858993460 -858993460 -858993460 -858993460 1 2 3 4 5. Почему появляются эти "-858993460"? Я так понимаю проблема в памяти, но как ее решить?

void main()
    {
        int array1[5], array2[5], merge[10], i, j, k, size1, size2, size;
        // elements qty for 1st array
cout << "Please enter the amount of elements in the array 1: " << endl;
        cin >> size1;
        // actual elements
        cout << "Please enter the array elements: " << endl;
        for (int i = 0; i < size1; i++) {
            scanf_s("%d", &array1[i]);
        }
        // elements qty for 2nd array
        cout << "Please enter the amount of elements in the array 2: " << endl;
        cin >> size2;
        // actual elements
        cout << "Please enter the array 2 elements: " << endl;
        for (k = 0; k < size2; k++) {
            scanf_s("%d", &array2[k]);
        }
        // making total elements amount
        size = size1 + size2;
        // merging arrays
        for (i = 0, j = size1; j < size && i < size2; i++, k++) {
            merge[k] = array2[i];
        }
        // printing 3rd array result
        cout << "Now the third array looks like this: " << endl;
        for (i = 0; i < size; i++) {
            cout << merge[i] << " ";
        }
    }
Answer 1

Вместо этого:

for (i = 0, j = size1; j < size && i < size2; i++, k++) {
    merge[k] = array2[i];
}

Сделайте, например, так:

for (i = 0, i < size1, i++) {
    merge[i] = array1[i];
}
for (i = size1, i < size1+size2, i++) {
    merge[i] = array1[I-size1];
}
Answer 2

Во первых ваши массивы обьявлены с конкретным размером 5 , а вы вводите количество обрабатывемых элементов. Какая гарантия, что вы не вводите число больше чем 5?

Во вторых после цикла:

for (k = 0; k < size2; k++) {
     scanf_s("%d", &array2[k]);
}

переменная k примет значение size2, но вы выполняете:

for (i = 0, j = size1; j < size && i < size2; i++, k++) {
    merge[k] = array2[i];
}

Какая смысль в переменной J, непонятно. Фактически вы присваиваиваете элементу merge[size2] и последующим элементам значения из второго массива, а остальные остаются неинициализированными

Answer 3

Fswt, Вы указали в тегах C++, и даже используете объекты std::cin, std::cout, но почему Вы не хотите в полной мере использовать стандартную библиотеку для решения Ваших задач?

Я позволю себе сделать Вам несколько замечаний и предложу некоторые правки. Использовать их или нет - на Ваше усмотрение.

  1. Вы используете массивы фиксированной длинны, какой тогда смысл запрашивать у пользователя их размер? Если использование массивов не является обязательным условием Вашего задания, используйте std::vector.
  2. Вы одновременно используете cin, cout, операторы ввода-вывода и здесь же - scanf_s. Это функция точно не определена в стандарте C++, и ее наличие в библиотеке скорее всего опционально.

Предположим, что Вы согласились использовать вектор. Тогда можно реализовать ф-ию, которая будет читать данные из стандартного ввода и "складывать" их в массив:

auto processInput(std::vector<int>& array, std::istream& is) -> void
{
    std::copy(std::istream_iterator<int>(ss), std::istream_iterator<int>(), std::back_inserter(array));
}

std::copy - это обобщенный алгоритм для копирования элементов из одного диапазона в другой, std::back_inserter - функция для создания адаптера итератора вставки, которая получает на вход контейнер и генерирует выходной итератор.

Однако, если Вы попытаетесь использовать данную функцию в таком виде, как она реализована на данный момент, у Вас ничего не получится - нажатие клавиши Enter не прервет процесс чтения потока и, соответственно, он продолжится до тех пор, пока не будет сгенерирован сигнал (при условии, что Вы вводите данные с консоли) или не произойдет ошибка при чтении потока.

Условимся, что процесс чтения данных с потока должен быть прекращен по нажатию клавиши Enter, тогда нам нужно внести некоторые изменения в реализацию функции processInput:

auto prepareInput(std::istream& is) -> std::istringstream
{
    std::string tmp;
    std::getline(is, tmp);
    return std::istringstream(tmp);
}

Это вспомогательная функция, назначение которой - сформировать строковый поток ввода, который в дальнейшем и будет использоваться для чтения данных:

auto processInput(std::vector<int>& array, std::istream& is) -> void
{
    auto ss = prepareInput(is);
    std::copy(std::istream_iterator<int>(ss), std::istream_iterator<int>(), std::back_inserter(array));
}

Для объеденения array_a и array_b Вы можете воспользоваться функцией std::merge:

std::vector<int> res;
std::merge(array_a.cbegin(), array_a.cend(),
           array_b.cbegin(), array_b.cend(), std::back_inserter(res));

Исходный код завершенной программы:

#include <iostream>
#include <vector>
#include <sstream>
auto prepareInput(std::istream& is) -> std::istringstream;
auto processInput(std::vector<int>& array, std::istream& is) -> void;
int main()
{
    std::vector<int> array_a, array_b;
    processInput(array_a, std::cin);
    processInput(array_b, std::cin);
    std::vector<int> res;
    std::merge(array_a.cbegin(), array_a.cend(),
               array_b.cbegin(), array_b.cend(), std::back_inserter(res));
}
auto prepareInput(std::istream& is) -> std::istringstream
{
    std::string tmp;
    std::getline(is, tmp);
    return std::istringstream(tmp);
}
auto processInput(std::vector<int>& array, std::istream& is) -> void
{
    auto ss = prepareInput(is);
    std::copy(std::istream_iterator<int>(ss), std::istream_iterator<int>(), std::back_inserter(array));
}
READ ALSO
Решение СЛАУ с помощью библиотеки Eigen C++

Решение СЛАУ с помощью библиотеки Eigen C++

Я хочу воспользоваться методами библиотеки Eigen для решения СЛАУЯ взяла пример из файла документации и проект не компилируется

178
Electron и C++ / C# | Обмен данными напрямую

Electron и C++ / C# | Обмен данными напрямую

Вопрос заключается только в теории

181
Константный параметр в шаблоне по умолчанию

Константный параметр в шаблоне по умолчанию

Подскажите в чем ошибка при реализации следующей ситуации:

203
Как визуализировать прямой поток аудио (интернет радио)?

Как визуализировать прямой поток аудио (интернет радио)?

В интернете много плееров с визуализацией, но все они основаны на статичном mp3 файле, который либо лежит на сервере, либо загружается пользователемЯ...

162