Вот такой код. При выполнении ввожу: 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] << " ";
}
}
Вместо этого:
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];
}
Во первых ваши массивы обьявлены с конкретным размером 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] и последующим элементам значения из второго массива, а остальные остаются неинициализированными
Fswt, Вы указали в тегах C++, и даже используете объекты std::cin
, std::cout
, но почему Вы не хотите в полной мере использовать стандартную библиотеку для решения Ваших задач?
Я позволю себе сделать Вам несколько замечаний и предложу некоторые правки. Использовать их или нет - на Ваше усмотрение.
std::vector
.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));
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Я хочу воспользоваться методами библиотеки Eigen для решения СЛАУЯ взяла пример из файла документации и проект не компилируется
Подскажите в чем ошибка при реализации следующей ситуации:
В интернете много плееров с визуализацией, но все они основаны на статичном mp3 файле, который либо лежит на сервере, либо загружается пользователемЯ...