【问题标题】:C program is ending by itself during nested loopC 程序在嵌套循环期间自行结束
【发布时间】:2021-11-05 17:17:25
【问题描述】:

我的 C 程序自行结束,我无法找出问题所在。我在停止的循环上方添加了一条注释。

我正在创建一个程序来匹配数组中的 dna 样本。 dna 样本是浮点数,我正在从文件中读取它们。

这是我正在读取的文件:

2.3 3.3 4.5 6.7 7.8 2.1 3.2 4.3 5.2 6.5
5
2.3 3.3 4.5 6.7 7.8 2.1 3.2 4.3 5.2 6.5
1.3 0.3 9.5 8.7 5.8 4.1 3.2 2.3 6.2 6.9
6.3 9.3 4.3 6.4 7.5 2.9 3.0 4.1 5.3 6.5
6.1 9.4 4.5 6.6 7.4 2.8 3.2 4.4 5.0 6.0
2.3 3.3 4.5 6.6 7.8 2.2 3.2 4.3 5.2 6.5

预期的输出是将打印所有值(犯罪样本为 5 行),第一行将被匹配,其余的则不会。然而,这是我的输出:

Reading chromosomes of the suspect. 
2.3 3.3 4.5 6.7 7.8 2.1 3.2 4.3 5.2 6.5
Reading chromosomes of the criminals.
2.3 3.3 4.5 6.7 7.8 2.1 3.2 4.3 5.2 6.5
1.3 0.3 9.5 8.7 5.8 4.1 3.2 2.3 6.2

我尝试过调试它,有一次它在循环期间将我的 sizeR 变量随机分配为 10000 或其他值,我认为这是某个地方的问题,但现在不是我在努力理解为什么它仍在停止对我来说。

代码:

#include <stdio.h>
#include <stdbool.h>

FILE *fp;

int main(){
    fp = fopen("dna_input.txt", "r");

    int sizeR = 0, sizeC = 10; // declare size variables
    float suspect[sizeC]; // declaring suspect array
    float criminal[sizeR][sizeC]; // declaring criminal array

    // reads 10 input values from first line of the file
    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");

    // reads integer from 2nd line of file for the amount of lines to read for next loop
    fscanf(fp, " %d", &sizeR);

    printf("Reading chromosomes of the criminals. \n"); 
    // read 10 input values into 5 criminal arrays    
    // THIS LOOP IS WHERE MY PROGRAM IS STOPPING <---------------------------------------------
    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");
    }        

    // check for match
    bool match = true;
    for (int i = 0; i < sizeR; i++){
        for (int j = 0; j < sizeC; j++){
            if (suspect[j] != criminal[i][j]){
                match = false;
            }  
        }    
        // display matching result
        if (match)
            printf("The two profiles match! \n");
        else
            printf("The two profiles don't match! \n");
    }

    fclose(fp);
    return 0;
}

【问题讨论】:

  • int sizeR = 0 ??两组嵌套循环都不会迭代,因此没有输出。
  • 您正在使用sizeR = 0 创建“犯罪”数组,这肯定是错误的。设置大小变量后移动float criminal[sizeR][sizeC]; 行。
  • 之后您还可以通过用户输入覆盖这些值。
  • 你有fscanf(fp, " %d", &amp;sizeR); 数组被定义。我在第一次评论时没有注意到这个输入。
  • 可变长度数组的维度在它定义的点是固定的(或暂时用维度定义),在这种情况下也是零长度。

标签: c loops


【解决方案1】:

你需要动态分配罪犯数组。

//Here sizeR is 0 so you are declaring criminal[0][10]      
float criminal[sizeR][sizeC]; // declaring criminal array

典型的缓冲区溢出问题。

【讨论】:

    【解决方案2】:

    感谢cmets,我完全错过了。我已将我的犯罪数组移动到 fscanf 之后声明

    // reads integer from file for the amount of lines to read
    fscanf(fp, " %d", &sizeR);
    
    // declare criminal aray
    float criminal[sizeR][sizeC];
    
    

    【讨论】:

      猜你喜欢
      • 2015-06-30
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 2018-10-16
      • 2021-05-07
      • 1970-01-01
      相关资源
      最近更新 更多