#include<stdio.h>
int main()
{
int n,m,c;
scanf("%d%d",&n,&m);
while(n!=0&&m!=0){
int a[n],b[n+1];
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++){
if(m>a[i]&&m<a[i+1]){
c=i+1;
break;
}
}
for(int i=0;i<n+1;i++){
if(i<c){
b[i]=a[i];
}
else if(i==c){
b[i]=m;
}
else {
b[i]=a[i-1];
}
}
for(int i=0;i<n+1;i++){
printf("%d ",b[i]);
}
printf("\n");
}
}
这段代码的目标似乎是在已排序的数组a中插入一个新的数字m,然后输出新的排序后的数组。然而,这段代码有一些问题。
- 数组越界:在for循环中,你试图访问
a[i+1]
,其中i
的值可以从0
到n-1
。所以,当i
等于n-1
时,你试图访问a[n]
,这是越界的,因为数组a
的大小是n
。 - 逻辑错误:在插入m后,你并没有重新排序数组b。因此,即使m被插入在了正确的位置,数组b可能仍然不是排序的。
- 缺少返回值:虽然对于主函数来说,返回0或者不返回都是可以的,但是明确返回一个值通常被认为是一种好的编程习惯。
下面是对你的代码进行修正后的版本:
#include<stdio.h>
int main()
{
int n, m, c;
while(scanf("%d%d", &n, &m) == 2 && n != 0 && m != 0){
int a[n], b[n+1];
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
for(int i = 0; i < n; i++){
if(m > a[i] && (i == n - 1 || m < a[i+1])){
c = i + 1;
break;
}
}
for(int i = 0; i < n+1; i++){
if(i < c){
b[i] = a[i];
}
else if(i == c){
b[i] = m;
}
else {
b[i] = a[i-1];
}
}
// Re-sort array b
for(int i = 0; i < n; i++){
for(int j = i + 1; j < n + 1; j++){
if(b[j] < b[i]){
int temp = b[i];
b[i] = b[j];
b[j] = temp;
}
}
}
for(int i = 0; i < n+1; i++){
printf("%d ", b[i]);
}
printf("\n");
}
return 0;
}