在线编译器 C

#include <stdio.h> void swap_negmax_last(int size, int a[]){ int n_save=0,t=0,s=0; while(s<size){ if(a[s]<0){ n_save=a[s]; break; }s++; } while(t<size){ if(a[t]<0&&a[t]>n_save){ n_save=a[t]; }t++; } a[t]=a[size-1]; a[size-1]=n_save; for(int i=0;i<size;i++){ printf("%d ",a[i]); } return; } int main() { int a[11]; for(int m=0;m<10;m++){ scanf("%d",&a[m]); } swap_negmax_last(10,a); return 0; }
这段代码的目的是在数组中找到最大的负数,然后把它和数组的最后一个元素交换位置。但代码中存在几个问题。

第一个循环中,你找到了第一个负数并把它赋值给 n_save,但这里 break 会导致只检查到第一个负数就停止,而不是找到所有负数中的最大值。第二个循环中,你试图找到更大的负数,但 t 变量在第二个循环结束后已经指向 size,导致后续的交换操作使用了错误的索引。

- 第一个循环的 break 语句导致你只检查了第一个负数,而不是遍历整个数组。你需要重新考虑如何初始化 n_save 并遍历所有元素来找到最大的负数。
- 第二个循环结束后,t 的值是 size,所以 a[t] 访问了数组越界的位置。你需要记录最大负数的下标,而不是只记录值,这样才能正确进行交换。