这个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]
试试看,它工作正常。
此程序用于对数字#### 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]
试试看,它工作正常。