PAT平台运行时错误定位

15次阅读

共计 1218 个字符,预计需要花费 4 分钟才能阅读完成。

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。

3 参考文献:

[1] https://mergebubble.github.io… (PAT 1016 | 黑小猪与猪小白)
[2] https://blog.csdn.net/weibo12… (C++ 中 #if 0 … #endif 的用法 – 魏波 – CSDN 博客)
[3] https://blog.csdn.net/u011391… (C 语言中的复制函数(strcpy 和 memcpy)– Dufre – CSDN 博客)

正文完
 0