发布于 4年前

PAT平台,“运行时错误”定位

1 PAT平台,定位到“ 运行时错误”方法

我们用桌面版的IDE开发的代码,编译通过,且在本地运行正常,提交代码到PAT平台时,有时会报“运行时错误”。怎样定位到错误处呢?下面提供一个可行的方法,本方法参考文献1。
在开始之前,科普下#if 0 #endif,它相当于注释的作用,如下所示。具体参考文献2。

#if 0 
    // 夹在中间的代码块,是被注释掉的代码块
#endif

方法:
1 用#if 0 #endif,从main函数末尾开始,注释掉最末的代码块n。点击提交。进行步骤2。
2 查看提交结果,是否由“运行时错误”,转变成"答案错误"或者"答案正确"。
如果是,说明出现“运行时错误”的地方,在#if 0下面紧挨着的代码块处,进入步骤4。
如果否,进行步骤3。
3 将#if 0前移到当前#if 0所在代码块的前一个代码块位置,点击提交,返回步骤2。(例:第一次进行步骤3时,将#if 0剪切到第n-1个代码块之前,第二次进行3时,将#if 0剪切到第n-2个代码块之前......)。
4 定位到出错代码块处后,可以更细粒度的在出错代码块继续定位行。使用#if 0 #endif注释掉出错误代码块的最末一句。点击提交,查看提交结果,是否由“运行时错误”,转变成"答案错误"或者"答案正确"。
如果是的话,找到了出错代码行,结束查找过程。
如果否的话,把#if 0前移一行或若干行,点击提交,观察提交结果。逐行的,从后向前注释代码块n中的代码行,直到找到出错的代码所在行,结束查找过程。

#include <stdio.h>

int main(int argc, char **argv) {    
    // 代码块1
    {
        // ...       
    }

    // 代码块2
    {
        // ...       
    }

    ...
    // 所设它是出错代码块i
    {
        // code line1;        
        // code line2;

        ...

        // code linej-1
// 把"#if 0"前移一行或若干行,点击提交,观察提交结果,直到定位到出错的代码行。
#if 0        
        // code linej;
#endif 
    }
    ...

    // 代码块n-1
    {
        // ...       
    }    

// 逐步的移动"#if 0"到前一个代码块,直到定位到出错的代码块。
#if 0        
    // 代码块n
    {
        // ...       
    }    
#endif    
}

2PAT“ 运行时错误” 的一个例子。

开发语言:C。
出错描述:需求是将字符串复制到字符数组,使用的是strcpy(字符数组1,字符串2)函数。结果出现了上述错误。
解决方法:使用memcpy函数代替strcpy。参考文献3。

c
©2020 edoou.com   京ICP备16001874号-3