假设用户输入了数字10,11,22,33,44,55,66,77,88和& 99成一个数组。然后程序必须将低于50和高于50的数字分成两个不同的数组,即array2和array3。但是当我运行我的程序时,它会在array2和array3中显示一些垃圾内存。
我的程序将使用display:
运行array1中的数字
10, 11, 22, 33, 44, 55, 66, 77, 88, 99
array2中的数字
1972394090, 22, 33, 44, 0, 4202032, 2686624, 2686680, 2686924, 10, 11
array3中的数字
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;
}
答案 0 :(得分:1)
也许你想做这样的事情:
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
感兴趣,这会重新安排一个或多个元素。阵列/容器中。
答案 1 :(得分:0)
首先,数组索引从0开始而不是1.其次,您确实要复制感兴趣的数组元素,但array2
和array3
中的旧数组内容不是首先清除,显然也没有在调用代码中设置:这就是为什么当你打印数组元素时,你会看到&#34;垃圾&#34;像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作为结果 sentinel 值,因为它是array2
和array3
中唯一的整数值。)< / p>
答案 2 :(得分:0)
这是因为您可能会声明这样的矢量:
std::vector<int> array2(10);
并显示该向量中的每个元素。如果某个元素为空,则显示随机数据。
你应该只是向量化,而不是使用push_back() f.e。
if(array[i]>50)
array2.push_back(array[i]);