You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言初始for循环未达指定次数,请求排查问题原因

问题排查与修复方案

首先导致第一个for循环异常终止的核心问题是**scanf的参数错误**,后续代码还存在数组越界、逻辑错误等问题,逐一拆解如下:

1. scanf参数错误(直接引发循环异常)

第一个循环里的scanf("%d", array[i]);写法错误:scanf读取整数时需要传入变量的内存地址,而array[i]是数组元素的具体值,并非地址。这会导致scanf往非法内存地址写入数据,触发未定义行为,直接让循环提前终止。

修复方式:将参数改为&array[i],正确代码:

scanf("%d", &array[i]);

2. 冒泡排序的交换逻辑错误

冒泡排序的交换代码最后一步逻辑错误,array[j] = array[j-1];会把已经被覆盖的array[j-1]值(等于原array[j])赋值给array[j],等于没完成交换。

错误代码段:

k=array[j-1];
array[j-1]=array[j];
array[j]=array[j-1]; // 此处错误

修复后:

k = array[j-1];
array[j-1] = array[j];
array[j] = k; // 用临时变量k保存的原值赋值

3. 数组越界问题

  • 冒泡排序内层循环起始值j=10错误:数组array的下标范围是0~9(因为size=10),array[10]属于越界访问,会读取/修改非法内存,起始值应改为size-1(即9)。
  • 后续判断if(array[i]=array[i+1])中,当i=9时,array[i+1]是array[10],同样越界,循环条件应改为i < size-1。

4. 条件判断误用赋值运算符

if(array[i]=array[i+1])里用了赋值运算符=,而非比较运算符==,这会把array[i+1]的值赋给array[i],再判断赋值结果是否非零,完全偏离了“判断相邻元素是否相等”的逻辑。

修复方式:改为if(array[i] == array[i+1])


修复后的完整代码

#include <stdio.h>
#define size 10
int main(int argc, char *argv[]){
    int array[size],sum[size],k,sum1,i,j;
    sum1=0;

    printf("give 10 integers:\n");
    for(i=0; i<size; i++){
        scanf("%d", &array[i]);
        sum[i]=0;
    }
    
    for(i=0; i<size-1; i++){
        for(j=size-1; j>i; j--){
            if(array[j-1]>array[j]){
                k=array[j-1];
                array[j-1]=array[j];
                array[j]=k;
            }
        }
    }
    for(i=0; i<size-1; i++){
        if(array[i] == array[i+1])
            sum[i]=sum[i]+1;
    }
    for(i=0; i<size; i++){
        sum1=sum1+sum[i];
    }

    printf("%d", sum1);
    return 0;
}

内容的提问来源于stack exchange,提问作者Alchazov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:40:36