DevC++没有报错
在线编程网站提示可能是数组访问越界,但是我不太理解哪里会出现越界。
所以想请教一下。
#include<stdio.h>
int main()
{
int a[2]; //如果改为3就不会报错了,也不会有问题
scanf("%d%d%d", &a[0],&a[1],&a[2]);
for(int i = 0; i < 2; i=i+1) //就是一个冒泡排序
{
for(int j = 0; j < 2-i; j = j+1)
{
if(a[j+1]<a[j])
{
int x;
x = a[j];
a[j] = a[j+1];
a[j+1] = x;
}
}
}
printf("%d %d %d\n", a[0], a[1], a[2]);
return 0;
}
int a[2];
输入5 2 7,会得到5 5 2
但如果是 int a[3];
输入5 2 7,会得到7 5 2
DevC++没有报错
在线编程网站提示可能是数组访问越界
调试过程中发现在冒泡排序的循环里
int x;
x = a[j];
a[j] = a[j+1];
a[j+1] = x;
第一次运行这几排(交换两个数字位置),a[2]的值就出现了错误。
int a[2]包含且只包含两个元素a[0]、a[1]。你下一条scanf语句访问a[2]肯定越界了。。。
数组a的长度可以开大一点没关系,至少也要大于等于3。
下面是冒泡排序的C语言代码,可以参考一下:
//注意:由于每趟冒泡至少能把序列中最大的数找出来,所以不必每趟冒泡都把整个数组遍历一遍
/*冒泡排序,从小到大*/
void bubbleSort(int a[],int n){
bool exchange = true;
for(int ends=n-1;ends>0&&exchange;ends--){
exchange = false;
for(int i=0;i<ends;i++){
if(a[i]>a[i+1]){
int m=a[i];
a[i]=a[i+1];
a[i+1]=m;
exchange=true;
}
}
}
return;
}
for(int j = 0; j < 2-i; j = j+1)
改成
for(int j = 0; j < 2-i-1; j = j+1)
冒泡排序的时候,如果数组的个数是n,那么
外层for循环是:
for( int i=0;i<n-1;i++)
内层for循环是:
for(int j=0;j<n-1-i;j++)
所以,你数组是int a[2]的时候,n=2,带入上面的代码中,
外层for循环应该是:
for( int i=0;i<2-1;i++) // 或者 for( int i=0;i<1;i++)
内层for循环应该是:
for(int j=0;j<2-1-i;j++) // 或者 for(int j=0;j<1-i;j++)
这是python中的冒泡排序,可以参看着看问题出在哪里