今天我创建了一个程序,它有三个功能:
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/