今天我创建了一个具有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)
输出是:
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
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
该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数组之外的一个元素.