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

C语言DNA样本匹配程序嵌套循环运行时自动终止问题排查

问题根因及修复方案

1. 变长数组定义时机错误(导致程序崩溃的核心原因)

C语言的变长数组长度在定义时就会固定,不会随变量后续赋值变化。你在sizeR初始值为0的时候就定义了float criminal[sizeR][sizeC],此时这个二维数组的行容量是0,后续你读取到sizeR=5之后,往数组里写入数据属于数组越界访问,是未定义行为,会导致随机篡改内存中其他变量的值、程序提前终止等问题。
修复方式:将criminal数组的定义移动到读取sizeR的代码之后。

2. 浮点数直接比较逻辑错误

float类型存在精度误差,直接用==/!=判断两个浮点数是否相等可靠性极低,应该通过判断两个数差值的绝对值小于极小阈值(比如1e-6)来判定相等。

3. 匹配标志位未重置

你将match变量定义在循环外层,只要有一次匹配失败,match会永久为false,后续所有样本的匹配结果都会出错。应该每次比对新的犯罪者样本前,都将match重置为true。


修复后完整代码

#include <stdio.h>
#include <stdbool.h>
#include <math.h> // 用于fabs函数

int main(){
    FILE *fp = fopen("dna_input.txt", "r");
    // 增加文件打开失败判断
    if (fp == NULL) {
        printf("文件打开失败\n");
        return 1;
    }

    int sizeR = 0, sizeC = 10;
    float suspect[sizeC]; 

    // 读取嫌疑人样本
    printf("Reading chromosomes of the suspect. \n");
    for (int i = 0; i < sizeC; i++){
        fscanf(fp, " %f", &suspect[i]);
        printf("%.1f ", suspect[i]);
    }
    printf("\n");

    // 读取犯罪者数量后再定义criminal数组
    fscanf(fp, " %d", &sizeR);
    float criminal[sizeR][sizeC]; 

    printf("Reading chromosomes of the criminals. \n"); 
    // 读取所有犯罪者样本
    for (int i = 0; i < sizeR; i++){
        for (int j = 0; j < sizeC; j++){
            fscanf(fp, " %f", &criminal[i][j]);
            printf("%.1f ", criminal[i][j]);
        }
        printf("\n");
    }        

    // 匹配判断
    for (int i = 0; i < sizeR; i++){
        bool match = true; // 每次比对新样本前重置匹配标志
        for (int j = 0; j < sizeC; j++){
            // 浮点数相等判断用差值绝对值小于阈值
            if (fabs(suspect[j] - criminal[i][j]) > 1e-6) {
                match = false;
                break; // 已经不匹配可以提前退出循环
            }  
        }    
        if (match)
            printf("第%d个样本:匹配!\n", i+1);
        else
            printf("第%d个样本:不匹配!\n", i+1);
    }

    fclose(fp);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 03:27:03