错误代码:
#include<stdio.h>
int main()
{
int b;
int num[10];
for (int a = 0; a <= 9; a++)
{
scanf_s("%d", &num[a]);
}
for (int i = 0; i <10; i++)
{
for (int j = 0; j < 10- i; j++)//这里错了
{
if (num[j] >= num[j + 1])
{
b = num[j];
num[j] = num[j + 1];
num[j + 1] = b;
}
}
}
for (int k = 0; k <=9; k++)
{
printf_s("%d\n", num[k]);
}
return 0;
}
运行会出现
Run-Time Check Failure #2 - Stack around the variable 'num' was corrupted.
控制台也出现
-858993460
1
21
23
23
33
121
211
212
223
第一个负数明显是问题所在。
原因:越界了
正确代码:
#include<stdio.h>
int main()
{
int b;
int num[10];
for (int a = 0; a <= 9; a++)
{
scanf_s("%d", &num[a]);
}
for (int i = 0; i <10; i++)
{
for (int j = 0; j < 9 - i; j++)//关键
{
if (num[j] >= num[j + 1])
{
b = num[j];
num[j] = num[j + 1];
num[j + 1] = b;
}
}
}
for (int k = 0; k <=9; k++)
{
printf_s("%d\n", num[k]);
}
return 0;
}
为什么错了?
关键在于原理没有透彻, 具体看代码。
原理:比如10个数第一轮排序需要经过10-1=9次交换,所以n个数第一轮就需要n-1次交换,弟2轮就需要n-1-1次交换,第三轮n-1-1-1次循环........