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 博客)