【问题标题】:Runtime Error while Scanning a multidimensional array in C在 C 中扫描多维数组时出现运行时错误
【发布时间】:2020-04-06 23:17:33
【问题描述】:

我有一个程序可以计算在 N 秒内发生的病毒传播。我的程序从 data.in 文件中获取输入,该文件包含以下内容:

3 // How many testcases
3 1 // 3 is size of maps of the body that will be infected by the virus, and 1 is how many seconds it will spread.
###
###
V##

3 2
###
###
V##

3 3
###
###
V##

对于在身体周围传播的每一秒病毒# 地图。但我的问题是,每1个测试用例,第一个测试用例和第二个测试用例之间必须有一个分隔符,其中分隔符输入(\n)。我用 fget () 分隔每个测试用例;但是,在线法官给了我一个运行错误(10),这意味着10个测试用例中只有1个测试用例成功,其余的都给出了运行错误。

这是我尝试制作的代码:

#include <stdio.h>

int main()
{
    int cases,size,time;
    char body[500][500];
    FILE *fptr = fopen("data.in","r");
    fscanf(fptr,"%d\n",&cases);

    for(int i = 0; i < cases; i++){
        fscanf(fptr,"%d %d\n",&size, &time); 

        for(int j = 0; j < size; j++){
            fscanf(fptr,"%[^\n]\n", body[j]); 
        }
        fscanf(fptr,"\n");
        int newTime = time - 1; 

        for(int k = 0; k < size; k++){
            for(int l = 0; l < size; l++){
                if(body[k][l] == 'V'){
                    for(int m = k - newTime; m <= k + newTime; m++){
                        for(int n = l - newTime; n <= l + newTime; n++){
                            body[m][n] = '1'; // Flagging
                        }
                    }
                }
            }
        }

        printf("#%d:\n",i + 1);
        for(int o = 0; o < size; o++){
            for(int p = 0; p < size; p++){
                if(body[o][p] == '1') printf("V");
                else printf("#");
            } 
            printf("\n");
        }
        printf("\n");
    }

    fclose(fptr);
    return 0;
}

我的输出:

#1:
###
###
V##

#2:
###
VV#
VV#

#3:
VVV
VVV
VVV

但是,我的程序已经给出了正确的输出,但是当我提交到在线判断时,它给了我运行时错误。我该如何解决这个问题?

【问题讨论】:

  • 什么是在线法官?
  • 你不能在分配的数组之外读写。越界写入将发生在body[m][n] = '1';
  • @machine_1 它类似于 vjudge.net,他使用一个检查每个案例的系统来检查我们的编码
  • 仅供参考,%d 忽略前导空格,包括换行符。 fscanf(fptr,"\n"); 完全没有意义。在扫描下一个测试的即将到来的维度时,无论如何你都会点击 %d
  • @MikeCAT 那么,我应该在每个测试用例中将数组设置为零吗?无论如何,约束只到body [100] [100],但我给了很多额外的空间,所以它可以工作,但它没有:/(无论如何,我已经通过移动char body [100] [100] = {{}}; 进入测试用例的循环,但它仍然给出运行时错误:\

标签: c file scanf


【解决方案1】:

mnbody[m][n] = '1'; // Flagging 行可能是负值。

这意味着可能会在该行发生越界写入,并可能导致运行时错误。

要解决这个问题,您应该在像这样访问之前检查值是否在所需范围内:

if (0 <= m && m < size && 0 <= n && n < size) {
    body[m][n] = '1'; // Flagging
}

现在你会得到错误的答案(在处理之前销毁V)或超出时间限制(对于无效的O(size^2 * time^2) 解决方案),但运行时错误将被消除。

【讨论】:

  • 好的,我明白我的错误了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
  • 2017-03-15
  • 1970-01-01
  • 2016-01-21
  • 2017-07-08
  • 2018-11-26
相关资源
最近更新 更多