排序错误输出+在Array中找到bigges

Mic*_*chi 0 c arrays

今天我创建了一个具有3个功能的程序:

sortArray(数组,长度);
removeDuplicateInArray(array,length);
max = findMax(array,length);

该程序工作正常但是,如果我运行它多次,比方说三次,输出只有一个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;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

michi@michi-laptop:~$ ./program 
9 8 7 6 5 4 3 2 1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -10 
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

输出应为9,但输出不总是9

M O*_*ehm 7

removeDuplicateInArray函数更改了数组的长度,但main在您的情况下,调用函数不知道新的长度.

您可以从函数返回新长度:

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

    return length;
}
Run Code Online (Sandbox Code Playgroud)

并称之为:

length = removeDuplicateInArray(array, length);
Run Code Online (Sandbox Code Playgroud)

或者你可以将长度作为指针传递,这将反映出这些:

void removeDuplicateInArray(int *array, int *plength) ...
{
    int length = *plength;

    // use and modify length as above

    *plength = length;
}
Run Code Online (Sandbox Code Playgroud)

并称之为:

removeDuplicateInArray(array, &length);
Run Code Online (Sandbox Code Playgroud)

我更喜欢第二种变体,因为它不会让你不小心忘记了返回值.

您看到的垃圾值是从数组的边界之外移入的,因为您循环k < length并访问索引处的元素k + 1,这可能是length数组之外的一个元素.