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

时间:2016-10-21 06:57:00

标签: c dev-c++

enter image description here

此程序用于将数字#### 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]);
    }
}

4 个答案:

答案 0 :(得分:2)

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

您正在执行的程序行为未定义。 (&#34;新元素&#34;您观察到的可能是由于您通过该越界访问引入它。)

答案 1 :(得分:2)

您在这里有一些未定义的行为:b[j+1]表示您在边界之外访问的j=9(有效b[10],这是b的第11个元素,但它只包含数组的10个元素。

当你有这样的行为时,会发生什么是完全不可预测的。它可能会奏效。它可能会产生垃圾值(就像它为你做的那样)。在另一次尝试中,您的程序可能会因段错而崩溃。

答案 2 :(得分:0)

在排序

中删除中的 - i for(int j = 0; j&lt; 10-i; j ++)
#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;
            }
        }
    }   
}

答案 3 :(得分:0)

解决。按反向/正向顺序排序数字。

#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]

试一试,它的工作正确。