Пусть говорят, что пользователь вводил числа 10, 11, 22, 33, 44, 55, 66, 77, 88 и 99 в массив. Затем программа должна выделять числа ниже 50 и выше 50 на два разных массива, а именно array2 и array3. Но когда я запускаю свою программу, он отображает некоторую память мусора в array2 и array3.
Моя программа будет работать с дисплеем:
Числа в массиве 1
10, 11, 22, 33, 44, 55, 66, 77, 88, 99
Числа в массиве2
1972394090, 22, 33, 44, 0, 4202032, 2686624, 2686680, 2686924, 10, 11
Числа в массиве 3
2686700, 4202032, 0, 2686604, 55, 66, 77, 88, 99, 1972394134, 1972394090
это мой код функции (N определяется как 10)
void segArr(int array[N], int array2[N], int array3[N])
{
int i;
for(i=1; i<N; i++)
{
if(array[i]<50)
array2[i]=array[i];
if(array[i]>50)
array3[i]=array[i];
}
return;
}
Возможно, вы хотите сделать что-то вроде этого:
const int split=50;
int n2=0, n3=0;
for(int i1=0; i1!=n1; ++i1)
if(array1[i1] < split)
array2[n2++] = array1[i1];
else
array3[n3++] = array1[i1];
// n2,n3 now hold the filled sizes of array2 and array3
Конечно, все это гораздо лучше сделано с использованием std
контейнеров... В частности, вас может заинтересовать std::partition
или std::stable_partition
, которые переупорядочивают порядок или элементы в массиве/контейнере.
Это потому, что вы, вероятно, объявляете вектор следующим образом:
std::vector<int> array2(10);
и отображать каждый элемент в этом векторе. Если какой-то элемент пуст, вы показываете случайные данные.
вы должны просто указать вектор, а не использовать push_back() fe
if(array[i]>50)
array2.push_back(array[i]);
Для начала индексы массива начинаются с 0, а не 1. Во-вторых, вы действительно копируете интересующие элементы массива, но какой бы старый массив не array2
в array2
а array3
не очищался и, очевидно, не был установлен в вызывающем коде либо: почему, когда вы печатаете элементы массива, вы видите значения "мусора", такие как 1972394090
, хотя технически это неопределенное поведение, даже чтобы попытаться напечатать неинициализированное значение, и вы могли бы в равной степени отключить или иным образом сбой программы.
Возможно, вы захотите сделать что-то вроде этого:
void segArr(int array[N], int array2[N], int array3[N])
{
size_t i2 = 0, i3 = 0;
for (size_t i = 0; i < N; ++i)
{
if (array[i] < 50)
array2[i2++] = array[i];
else if (array[i] > 50)
array3[i3++] = array[i];
}
if (i2 < N) array2[i2] = 50;
if (i3 < N) array3[i3] = 50;
}
Таким образом, вы можете распечатать элементы array2
и array3
0 по N-1, останавливаясь раньше, если вы увидите значение 50
. (Я использую 50 в качестве значения для конечного результата, потому что это единственное целочисленное значение, которое вы никогда не могли бы иметь в array2
или array3
.)
array2[]
и array3[]
все еще содержат мусор ...
[N-1]
если нет 50 - не будут мусором. Я не вижу смысла тратить время / код, устанавливая эти элементы на что-либо, кроме мусора, когда страж дает понять, где останавливаются значимые данные. Когда вы зациклите их печать, остановитесь, когда увидите 50, и все ранее напечатанные значения не должны быть мусором.
array2[1]
? Вы ничего не назначали ему, поэтому он будет содержать случайные биты. Я рекомендую изучить C ++, прежде чем спрашивать