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
相关产品推荐
相关产品推荐

