今天我创建了一个程序,它有三个功能:
sortArray(数组,长度);
移除的uplicateinarray(数组,长度);
max=findMax(数组,长度);
程序运行得很好,但是如果我再运行一次,比如说,三次,输出只有一个OK,另外两个是不同的,我认为这与findMax函数中数组的长度有关,因为我删除了重复项,数组的大小也不一样。我不确定有没有问题。
程序如下:

#include<stdio.h>

void sortArray(int *array, int length){
    int i, j, k, temp;

    for(i=0;i<length-1;i++){
        for(k=0;k<length-i-1;k++){
            if(array[k]<array[k+1]){
                temp=array[k];
                array[k]=array[k+1];
                array[k+1]=temp;
            }
        }
    }

    for(j=0;j<length;j++){
        printf("%d ",array[j]);
    }
    printf("\n\n");
}

void removeDuplicateInArray(int *array, int length){
    int i,j,k;

    for (i = 0; i < length; i++) {
      for (j = i + 1; j < length;j++) {
         if (array[j] == array[i]) {
            for (k = j; k < length; k++) {
               array[k] = array[k + 1];
            }
            length--;
         }else{
            j++;
         }
      }
   }

   for (i = 0; i < length; i++) {
      printf("%d ", array[i]);
   }
   printf("\n\n");
}

int findMax(int *array, int length){
    int i;
    int max = array[0];

    for(i=1;i<length;i++){
        if(max == array[i]){
            continue;
        }

        if(max<array[i]){
            max = array[i];
        }
    }
    return max;
}

int main(void){
    int array[] = {-9,-7,-3,-1,9,7,3,1,-8,-6,-4,-10,-2,8,6,4,2,5,-5,-10};
    int length = sizeof array / sizeof array[0];
    int max;

    sortArray(array,length);
    removeDuplicateInArray(array, length);
    max = findMax(array, length);

    printf("Max = %d\n", max);
    return 0;
}

结果是:
michi@michi-laptop:~$ ./program
9 8 7 6 5 4 3 2 1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -10

9 8 7 6 5 4 3 2 1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10

Max = 9
michi@michi-laptop:~$ ./program
9 8 7 6 5 4 3 2 1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -10

9 8 7 6 5 4 3 2 1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10

Max = 9
michi@michi-laptop:~$ ./program
9 8 7 6 5 4 3 2 1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -10

9 8 7 6 5 4 3 2 1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10

Max = 2034093120
michi@michi-laptop:~$ ./program
9 8 7 6 5 4 3 2 1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -10

9 8 7 6 5 4 3 2 1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10

Max = 912874208
michi@michi-laptop:~$ ./program
9 8 7 6 5 4 3 2 1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -10

9 8 7 6 5 4 3 2 1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10

Max = 1269451840
michi@michi-laptop:~$ ./program
9 8 7 6 5 4 3 2 1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -10

9 8 7 6 5 4 3 2 1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10

Max = 1946221408
michi@michi-laptop:~$ ./program
9 8 7 6 5 4 3 2 1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -10

9 8 7 6 5 4 3 2 1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10

Max = 9

输出应该是9,但输出并不总是9

最佳答案

removeDuplicateInArray函数更改数组的长度,但在您的示例中,调用函数main不知道新的长度。
可以从函数返回新长度:

int removeDuplicateInArray(int *array, int length)
{
    // code as above

    return length;
}

这样称呼:
length = removeDuplicateInArray(array, length);

或者可以将长度作为指针传递,该指针将反映仓位:
void removeDuplicateInArray(int *array, int *plength) ...
{
    int length = *plength;

    // use and modify length as above

    *plength = length;
}

这样称呼:
removeDuplicateInArray(array, &length);

我更喜欢第二个变量,因为它不允许您意外地忘记返回值。
您看到的垃圾值从数组的界限之外移入,因为您循环到k < length并访问索引k + 1处的元素,该元素可能是length,它是数组之外的一个元素。

关于c - 错误的输出排序+在数组中找到最大的输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32210645/

10-11 22:07
查看更多