这个C程序有什么问题?我总是出现一个我们没有输入的新数字?用Dev-C++编译

What's wrong with this C program?I's always appear a new number we not input?Compiled with Dev-C++

此程序用于对数字#### min 到 max 进行排序

当我输入5 1 3 7 9 6 8 2 0 4
结果是 0 1 2 3 3 4 5 6 7 8
9 消失了,出现了另一个我们没有输入的 3
当我输入 99 88 77 66 55 44 33 22 11 0
结果是 0 3 11 22 33 44 55 66 77 88
99 消失了,出现了一个我们没有输入的 3。怎么了?

#include<stdio.h>

void sort(int b[]){
    for(int i = 0;i<10;i++){
        for(int j = 0;j<10-i;j++){
            if(b[j+1]<b[j]){
                int temp = 0;
                temp = b[j+1];
                b[j+1] = b[j];
                b[j] = temp;
            }
        }
    }   
}

void main(){
    int a[10];
    printf("please enter numbers you want to sort:\n");
    for(int i = 0;i<10;i++){
        scanf("%d",&a[i]);
    }
    printf("The number you have input were:");
    for(int i=0;i<10;i++){
        printf("%d ",a[i]);
    }
    sort(a);
    printf("The sorted numbers are:");
    for(int i=0;i<10;i++){
        printf("%d ",a[i]);
    }
}

在某些情况下,b[j + 1] 将被评估为 j = 9(当 i 为 0 时会发生这种情况),因此您将访问数组边界之外的元素。

你这样做的程序行为是未定义。 (您观察到的 "new element" 可能是由于您通过越界访问引入的)。

你在这里有一些未定义的行为:b[j+1] 你在边界外访问 j=9 次(实际上 b[10] 这是 [=13 的第 11 个元素=],但它只包含数组的 10 个元素。

当你有这样的行为时,会发生什么是完全不可预测的。它可能会起作用。它可能会产生垃圾值(就像它为您所做的那样)。再试一次,您的程序可能会因段错误而崩溃。

只需删除 - i in for(int j = 0;j<10-i;j++) in sorting

#include<stdio.h>

void sort(int b[]){
    for(int i = 0;i<10;i++){
        for(int j = 0;j<10-i;j++){
            if(b[j+1]<b[j]){
                int temp = 0;
                temp = b[j+1];
                b[j+1] = b[j];
                b[j] = temp;
            }
        }
    }   
}

改为

#include<stdio.h>

void sort(int b[]){
    for(int i = 0;i<10;i++){
        for(int j = 0;j<9;j++){ //just remove the i because it is useless. 
                                //change the maximum iteration to 10 to prevent out of bounds exception
            if(b[j+1]<b[j]){
                int temp = 0;
                temp = b[j+1];
                b[j+1] = b[j];
                b[j] = temp;
            }
        }
    }   
}

已解决。按 reverse/forward 顺序对数字进行排序。

#include<stdio.h>

void sort(int b[]){
     int temp = 0;
     for(int i = 0;i<10;i++){
          for(int j = 0;j<10-i-1;j++){
              if(b[j+1] > b[j]){
                 temp = b[j];
                 b[j] = b[j+1];
                 b[j+1] = temp;
              }  
          }
     }
 }

int main(){

    int a[10];
    printf("\nplease enter numbers you want to sort:\n");
    for(int i = 0;i<10;i++){
        scanf("%d ",&a[i]);
    }
    printf("\nThe number you have input were:");
    for(int i=0;i<10;i++){
        printf("%d ",a[i]);
    }

   sort(a);

    printf("\nThe sorted numbers are:");
         for(int i=0;i<10;i++){
              printf("%d ",a[i]);
         }

return 0;
}

如果您想按正向排序只需更改:

  b[j+1] > b[j] to b[j+1] < b[j]

试试看,它工作正常。