否则会导致输出不正确

时间:2018-09-11 17:55:00

标签: c if-statement

我发现并更正了分配作业所需的程序中的错误。但是我不明白为什么会发生错误,我想了解将来会发生什么。

程序要求用户输入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++;

}

突然输出正确,我没有得到那么多数字。为什么会这样?

1 个答案:

答案 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,您还是不会检查)。