我发现并更正了分配作业所需的程序中的错误。但是我不明白为什么会发生错误,我想了解将来会发生什么。
程序要求用户输入2个int数组的大小,然后提示用户输入这些数组将保留的值。然后,它要求用户输入数组1的一系列索引,以将值添加到数组2的给定位置之前。然后再生成2个数组,以显示新数组2以及从数组1添加的新值。
#include <stdio.h>
void fillArray(int x[], int size);
int main()
{
int size1, size2, start, end, position;
//getting input and creating array one
printf("How big is array one?: ");
scanf("%d", &size1);
int inputArray1[size1];
printf("Please enter the numbers for array one: ");
fillArray(inputArray1, size1);
//getting input and creating array two
printf("How big is array two?: ");
scanf("%d",&size2);
int inputArray2[size2];
printf("Please enter the numbers for array two: ");
fillArray(inputArray2, size2);
printf("Enter the start and end index of array one to be removed: ");
scanf("%d %d", &start, &end);
printf("Enter the position of array two to be added before: ");
scanf("%d", &position);
int size3 = ((end - start) + size2+1), size4 = (size1 - (end - start));
int outputArray2[size3], kIterator=0;
for(int i=0; i<size3; i++){
if(i == position){
for(int j=start; j<=end; j++){
outputArray2[i] = inputArray1[j];
i++;
}
}else{
//HERE IS WHERE I FIXED THE ERROR
outputArray2[i] = inputArray2[kIterator];
kIterator++;
}
}
for(int i=0; i<size3; i++){
printf("%d ", outputArray2[i]);
}
return 0;
}
//Function to fill an array with user inputs
void fillArray(int x[], int size){
for(int i=0; i<size; i++)
scanf("%d", &x[i]);
}
数组一有多大?:8
请输入数组一的数字:9 12 8 41 38 12 67 49
两个数组有多大?:3
请输入第二个数组的数字:11 27 6
输入要删除的数组一的开始和结束索引:2 5
输入要在其之前添加的第二个数组的位置:1
11 8 41 38 12 32767 27
为什么会出现此输出?输出应为:11 8 41 38 12 27 6
当我删除else块,但使代码看起来像这样时:
for(int i=0; i<size3; i++){
if(i == position){
for(int j=start; j<=end; j++){
outputArray2[i] = inputArray1[j];
i++;
}
}
//HERE IS WHERE I FIXED THE ERROR
outputArray2[i] = inputArray2[kIterator];
kIterator++;
}
突然输出正确,我没有得到那么多数字。为什么会这样?
答案 0 :(得分:0)
您没有分配outputArray2
数组的第5个成员。放置一些printfs:
for(int i = 0; i < size3; i++){
if (i == position) {
for(int j = start; j <= end; j++) {
printf("i=%d j=%d\n", i, j);
outputArray2[i] = inputArray1[j];
i++;
}
} else {
printf("i=%d kIterator=%d\n", i, kIterator);
outputArray2[i] = inputArray2[kIterator];
kIterator++;
}
}
您可以看到:
i=0 kIterator=0
i=1 j=2
i=2 j=3
i=3 j=4
i=4 j=5
i=6 kIterator=1
i
从不等于5
,因此outputArray2[5]
从未被初始化并且具有未初始化的值。这是为什么?因为i
递增了两次。
想象一下,您上次与outputArray2[i] = inputArray1[j];
和i = 4
在行j = 5 = end
上。然后下一行i++
使i = 5,然后j++
中的for
递增j = 6
,该值大于end
,因此for(int j = start; j <= end; j++)
退出。然后执行第一个i++
中的for(int i = 0; i < size3; i++)
语句,从而将i
的第二次增加到6
!您还可以使用以下方法更好地修复代码:
for(int i = 0; i < size3; i++){
if (i == position) {
for(int j = start; j <= end; j++) {
outputArray2[i] = inputArray1[j];
i++;
}
i--;
} else {
outputArray2[i] = inputArray2[kIterator];
kIterator++;
}
}
此方法比您的代码更好,因为在end == size3
时,循环不会尝试为outputArray2
(即outputArray2[size3] = smth
)分配超出范围的值。 (所有假设都是position+(end-start) <= size3
,您还是不会检查)。